0

我的 python 脚本中有一个字典,其中包含 column_name:value 形式的数据,我想从中创建更新语句。我正在使用 python 3.3 和 cx-oracle 我找到了这个答案:How to update mysql with python where fields and entries are from a 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

我一直在谷歌搜索和阅读,但我找不到让它工作的方法。任何人都可以帮忙吗?

4

1 回答 1

0

文档看来,您正在调用:

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

与其他答案一样,您可以按位置匹配

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

或者,从错误消息中,一个简单的序列就可以了:

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

(我刚刚list(...)为 python 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, ...从字典里得到的一样。

或者可能

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

(替代方案是因为错误消息似乎表明序列和字典也可以工作)。

list(...)是需要的,因为在 python 3 中dict.values()返回某种生成器的东西(技术上,一个“可迭代的视图”) -见这里

于 2013-08-13T23:54:51.380 回答