从Python Dictionary创建Oracle Update语句

时间:2013-08-13 21:27:02

标签: python oracle cx-oracle

我的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

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

1 个答案:

答案 0 :(得分:0)

来自docs

似乎你在呼唤:

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

在另一个答案中,您可以按位置匹配

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

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

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

(我刚刚为python 3添加了list(...) - 见下文)

但这取决于两次迭代的顺序是相同的(在这种情况下cpython可能是正确的,但不是你应该信任的东西)。在我看来,使用命名绑定(使用:name而不是%s)会更好:

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

其中**就像来自dict的name1=value1, name2=value2, ...

或者

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

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

需要list(...),因为在python 3 dict.values()中返回某种生成器(技术上,“可迭代视图”) - see here