Вставьте python dict в БД SQLite - PullRequest
       1

Вставьте python dict в БД SQLite

3 голосов
/ 11 января 2012

У меня есть словарь, в который я хочу добавить все значения в базу данных sqlite. Все ключи в словаре существуют в базе данных, и все ключи имеют тип string. Тем не менее, у меня проблемы с получением значений в базу данных. Следующий код выглядит некрасиво, небезопасно и выдает ошибки всякий раз, когда встречается строка со знаком «в ней», но это вроде работает.

Query="INSERT INTO packages VALUES("
    for tag in Tags:
       Query=Query + '"' + Package[tag] + '", '
    Query=Query[:-2]+")"
cursor.execute(Query)

Как я могу элегантно исправить это так, чтобы он был безопасным и принимал входные данные с "в строке"? Я встречал несколько других методов. Например:

fields = Package.keys()
values = Package.values()
query = "INSERT INTO packages (%s) VALUES (%%s);" % (",".join(fields))
cursor.execute(query, values)

но выдает ошибку типа.

TypeError: function takes at most 2 arguments (38 given)

Самое элегантное решение, с которым я когда-либо сталкивался, кажется

sql_insert = ('INSERT INTO packages (%s) VALUES (%s)' % 
             (','.join('%s' % name for name in Package),
             ','.join('%%(%s)s' % name for name in Package)))
cursor.execute(sql_insert, Package)

но выдает операционную ошибку, говоря

sqlite3.OperationalError: near "%": syntax error

Еще раз, мой вопрос: как мне элегантно безопасно добавить значения из словаря в базу данных?

P.S. Также стоит отметить, что я использую Python 2.5.1.

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Afaik, когда запрос имеет "?" метод placeholder execute () автоматически выполняет экранирование, основываясь на типах аргументов. Итак, должно работать следующее:

query = 'INSERT INTO packages VALUES(%s)' % ','.join(['?'] * len(Tags))
cursor.execute(query, Tags)
1 голос
/ 23 августа 2013

Я столкнулся с той же проблемой, однако у меня была проблема, что не все словарные записи содержали все столбцы таблицы, поэтому я создал следующее решение

keys, values = zip(*Package.items())
insert_str =   "INSERT INTO packages (%s) values (%s)" % (",".join(keys),",".join(['?']*len(keys)))
cursor.execute(insert_str,values)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...