2012-06-22 3 views
1

Я работаю над скриптом для синтаксического анализа файла csv и создания ввода для таблицы MySQL.Python MySQL INSERT from csv

Я импортирую данные через csv.reader, поэтому каждая строка представляет собой список строк. Я хочу перебирать строки и вносить разные записи в базу данных.

я могу получить следующий тест на работу:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (1, 'entry1', 'entry2');" 
cursor.execute (sql) 

Так что мои связи работает SQL и принцип синтаксиса SQL в порядке. Я также могу получить доступ к записям, которые я хочу разместить там, и они верны и типа данных, которые я ожидаю. Однако, я, кажется, не быть в состоянии использовать тот же синтаксис SQL с переменными внутри итераций:

allData = csv.reader(open('TestTable.csv', 'rb'), delimiter=',', quotechar='|') 
for row in allData: 
    sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (row[0], row[1], row[2]);" 
    cursor.execute (sql) 

Это порождает ошибки Синтаксис:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to our MySQL server version for the right syntax to use near '[0], row[1], row[2])' at line 1 

Но типы данных являются правильными и синтаксис SQL такой же, как в рабочем примере ...

Может ли кто-нибудь сказать мне, что я делаю неправильно и как заставить его работать?

(В конце концов, я хочу, чтобы не только вставить чистые записи CSV, но и полученных значения, поэтому я не только с помощью MySQL массового импорта.)

Заранее спасибо за вашу помощь! Lastalda

ответ

3

использование:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (?, ?, ?);" 
cursor.execute (sql, (row[0], row[1], row[2])) 

Questionmark является заполнителем. Дополнительным преимуществом использования заполнителей является то, что они автоматически делают ваш ввод «безопасным», избегая qoutes и т. Д.
Прямо сейчас вы используете row[0], row[1], row[2] в виде строки с текстом «строка [0], строка [1], row [2] ", вместо того, чтобы сообщать python использовать значения этих переменных.


Кроме того, если вы хотите использовать строки нескольких длин, или если вы хотите, чтобы иметь возможность легко изменить размер вашего списка ввода, вы можете динамически создавать заполнители:

sql = "INSERT INTO testSmall VALUES (%s);" % ', '.join('?' for _ in row) 
cursor.execute (sql, row) 
+0

Ах! Спасибо, это имеет смысл! – Lastalda

+0

Отличный кусок кода! Почему я получаю «Не все аргументы, преобразованные во время форматирования строк»? :( – Pitto

2

То, как вы это делаете, row[n] s не относится к переменной row, но это всего лишь кусок строки, посланный как MySQL. (Держу пари, что вы исходите из фона PHP и ожидаете, что двойные кавычки заменят ваши переменные своими значениями).

Вы можете сделать это, чтобы вставить значения в строке (любая строка):

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);" % row # will map each %s to the `n`th element in `row` 

(это не будет работать, будьте осторожны, потому что, если строка [0] является abc, что строка не будет заключенный в кавычки, поэтому MySQL не будет интерпретировать его как строку). Попробуйте распечатать переменную sql и скопируйте ее в приглашение mysql, чтобы убедиться, что она будет работать.

Однако при использовании MySQL, лучше избежать этого, например, так:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);" 
    cursor.execute(sql, row) 

Вы можете прочитать в the docs.

+0

Благодарим вас за объяснение, теперь это имеет смысл! (И я на самом деле чертовски новичок в программировании, а python - это мой первый язык. Нет фона PHP вообще, только мой мозг ожидает чего-то, чего не бывает.) – Lastalda

+0

Ok Тогда у вас есть мозг, запрограммированный в PHP :) Рад, что это помогает. – jadkik94