вопрос Python sqlite - метод вставки - PullRequest
1 голос
/ 21 октября 2010

В приведенном ниже коде row - это кортеж из 200 элементов (чисел), а listOfVars - это кортеж из 200 строк, которые являются именами переменных в testTable.tupleForm - это список кортежей, 200 элементов в каждом кортеже.

Следующий код не работает.Возвращает синтаксическую ошибку:

for row in tupleForm:
    cmd = '''INSERT INTO testTable listOfVars values row'''
    cur.execute(cmd)     

Однако, следующее работает нормально.Может кто-нибудь объяснить, почему?Я считаю, что sqlite не интуитивно понятен.

for row in tupleForm:
    cmd = '''INSERT INTO testTable %s values %s'''%(listOfVars, row) 
    cur.execute(cmd)

Спасибо за вашу помощь.

Ответы [ 2 ]

7 голосов
/ 21 октября 2010
insert_query = '''INSERT INTO testTable ({0}) VALUES ({1})'''.format(
               (','.join(listOfVars)), ','.join('?'*len(listOfVars)))
cur.executemany(insert_query, tupleForm)

Пожалуйста, не используйте обычную интерполяцию строк для запросов к базе данных.
Нам повезло иметь DB-API , который подробно объясняет, как делать то, что вам нужно.

Edit:
Несколько быстрых причин, почему этот метод лучше, чем ваша вторая попытка:

  1. с помощью встроенных инструментов экранирования строк мы избегаем атак с использованием SQL-инъекций, а
  2. executemany принимает список кортежей в качестве аргумента.
0 голосов
/ 21 октября 2010

Первая попытка использовать строки в качестве значений, что неверно. Вторая подставляет строковое значение кортежей в строку, что в обоих случаях приводит к (...).

Но обе формы неверны, поскольку вторая вообще не имеет значений. должен делать с помощью параметризованного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...