MySQL динамический запрос в Python - PullRequest
1 голос
/ 06 июля 2011

Я пытаюсь сделать что-то вроде следующего:

cursor = db.cursor() 
cursor.execute('INSERT INTO media_files (%s, %s, %s, %s ... ) VALUES (%s, %s, %s, %s,   ...)', (fieldlist, valuelist))
cursor.commit()

У меня есть 2 списка, список полей и список ценностей, каждый из которых содержит одинаковое количество элементов. Каков наилучший способ создания динамического запроса MySQL, в котором столбцы хранятся в списке полей, а значения хранятся в списке значений?

Ответы [ 2 ]

3 голосов
/ 06 июля 2011
cursor.execute('INSERT INTO media_files (%s) VALUES (%%s, %%s, %%s, %%s,   ...)' % ','.join(fieldlist), valuelist)

Чтобы было понятнее:

sql = 'INSERT INTO media_files (%s) VALUES (%%s, %%s, %%s, %%s,   ...)' % ','.join(fieldlist)
cursor.execute(sql, valuelist)
2 голосов
/ 06 июля 2011

Курсор ожидает, что параметры будут переданы в виде одной последовательности, поэтому вам нужно объединить - по порядку - поля и списки значений.

itertools.chain() делает именно это, однако возвращает генератор, и я не уверен, что cursor.execute() примет это как последовательность параметров. Попытайся. Если это не удалось, оберните его list()

import itertools
sql = 'INSERT INTO media_files (%s, %s, %s, %s ... ) VALUES (%s, %s, %s, %s,   ...)'
cursor.execute(sql, itertools.chain(fieldlist, valuelist))

EDIT:

Это решение будет не работать. Это приведет к тому, что имена полей будут экранированы и заключены в кавычки, что приведет к ошибке синтаксиса sql.
Я оставлю этот ответ, так как он может послужить полезным примером, но посмотрите на ответ @ Trent для решения.

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