2016-06-30 18 views
0

Я использую модуль MySQLdb в python для записи операторов SQL. Мне сложно использовать переменные так, как я хотел бы. Вот моя работа:Использование execute()/executemany() для операторов SQL в python

stmt = "\ 
INSERT INTO Table1\ 
(name, status)\ 
SELECT (:name1, :status1)\ 
     FROM dual\ 
WHERE NOT EXISTS (\ 
     SELECT 1 FROM Table1\ 
     WHERE name =(:name1))" 
dic = {"name1":"Bob", "status1":"Active"} 

dbcursor.executemany(stmt, dic) 
dbconnection.commit() 
print("Insertion to Table1 committed\n\n") 

Это не работает, я в конце концов откатить с сообщением об ошибке not all arguments converted during string formatting. Если я жестко кодирую значения словаря, то вставка отлично работает. Можете ли вы указать мне правильный способ использования переменных вместо жестко заданных значений?

+1

Совет: используйте "" "" ... "" "" тройное цитирование, и вам не придется использовать все эти обратные косые черты .. –

+0

Неужели есть исключение, если все откатывается? –

+0

@MartijnPieters yes, его «не все аргументы, преобразованные во время форматирования строки» –

ответ

0

executemany() принимает последовательность объектов параметров (словари), но вы передаете всего один. Либо используйте dbcursor.execute(), либо перейдите в последовательность словарей. Поскольку у вас есть только один словарь, просто использовать dbcursor.execute():

dbcursor.execute(stmt, dic) 

Потому что executemany() рассматривает второй аргумент в виде ряда параметров, каждый из которых используется в отдельном execute() вызова, вы фактически пытаетесь запустить заявления с ключи словаря в качестве параметров. В действительности, проходя в ваших dic как параметры производит:

for key in dic: 
    dbcursor.execute(stmt, key) 

где ключ также итератор, производя отдельные символы в качестве параметров, используемых. Вы пытаетесь запустить отчет с ('n', 'a', 'm', 'e', '1') и ('s', 't', 'a', 't', 'u', 's', '1'). Это не работает для ваших заявлений.

+0

Просто попробовал это. Ошибка говорит мне проверить мой синтаксис, так что это прогресс, и я проверяю свою версию sql сейчас для синтаксических правил –

 Смежные вопросы

  • Нет связанных вопросов^_^