2010-10-21 2 views
1

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

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

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

У вас есть стол с 200 колонками? Вероятно, для вас существует лучший дизайн базы данных. Например, попробуйте помещать то, что у вас есть в настоящее время, как и большинство имен столбцов, в собственный столбец. –

+1

Это не ошибка SQLite! SQLite не имеет никакого способа узнать, что означает 'listOfVars' или' row' ... – rsenna

+1

Попробуйте выполнить 'print (cmd)' после ваших 'cmd = ...' настроек, и вы увидите разницу в 2. Это не вопрос sqlite, это просто вопрос форматирования строки Python. Лучший способ выполнить то, что вы пытаетесь сделать, - это применить ответ Адама Бернье. – snapshoe

ответ

7
insert_query = '''INSERT INTO testTable ({0}) VALUES ({1})'''.format(
       (','.join(listOfVars)), ','.join('?'*len(listOfVars))) 
cur.executemany(insert_query, tupleForm) 

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

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

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

Спасибо за ваш ответ. Я еще не пробовал, так как я не совсем понимаю это; хотя я могу догадаться, что делают разные команды. Во всяком случае, оцените возможность узнать новые вещи. Для понимания, почему это решение лучше, чем мой второй метод, который работает. Я думаю, SilentGhost объяснил это, но я не понимаю. Я приму ответ, когда у меня появится шанс попробовать. Благодаря!! – Curious2learn

0

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

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