2013-08-13 6 views
0

У меня есть словарь в моем скрипте python, который содержит данные как column_name: значение, и из этого я хочу создать инструкцию для обновления. Я использую Python 3.3 и сх-оракул Я нашел этот ответ: How to update mysql with python where fields and entries are from a dictionary?Создание отчетов Oracle Update из Python Dictionary

и использовали его как:

SQL = 'UPDATE scheme SET {}'.format(', '.join('{}=%s'.format(k) for k in schemes_dict)) 
cursor.execute(SQL, schemes_dict.values()) 

но это ошибки с:

TypeError: expecting a dictionary, sequence or keyword args 

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

ответ

0

из docs, кажется, что вы звоните:

Cursor.execute(statement[, parameters], **keywordParameters) 

как в другой ответ, вы могли бы соответствовать по положению с

cursor.execute(SQL, *list(schemes_dict.values())) 

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

cursor.execute(SQL, list(schemes_dict.values())) 

(я только добавил list(...) для pytho n 3 - см. ниже)

, но это зависит от того, является ли порядок двух итераций одинаковым (что, скорее всего, верно в этом случае cpython, но не то, на что вам следует доверять вообще). мне кажется, что было бы лучше использовать именованные привязки (с использованием :name вместо %s):

SQL = 'UPDATE scheme SET {}'.format(', '.join('{}=:{}'.format(k, k) for k in schemes_dict)) 
cursor.execute(SQL, **schemes_dict) 

где **, как с name1=value1, name2=value2, ... от Dict.

или, может быть,

cursor.execute(SQL, schemes_dict) # using the new SQL above 

(альтернативы являются потому, что сообщение об ошибке, кажется, предполагает, что последовательности и dicts также будет работать).

list(...) необходим, потому что в python 3 dict.values() возвращает какую-то генераторную вещь (технически, «итерируемый вид») - see here.

+0

спасибо за это, но я все еще боюсь, когда я использую cursor.execute (SQL, ** schem_dict) Я получаю cx_Oracle.DatabaseError: ORA-01036: незаконное имя/номер переменной. Есть ли способ получить фактическое утверждение, которое отправляется в БД? Я попытался добавить print (cursor.statement), но он упал до того, как он туда попал – user2565150

+0

Я изменил ответ. для named bind это другой синтаксис SQL, но также попробуйте другие предложения. –