Python Sqlite3:插入表VALUE(字典在此处)

Python Sqlite3:插入表VALUE(字典在此处),第1张

Python Sqlite3:插入表VALUE(字典在此处)

如果您尝试使用a

dict
指定列名和值,则不能这样做,至少不能直接这样做。

这实际上是SQL固有的。如果不指定列名列表,则必须按

CREATE TABLE
顺序指定它们-
使用a不能执行
dict
,因为a
dict
没有顺序。当然,如果您确实想使用,可以使用
collections.OrderedDict
,确保其顺序正确,然后通过
values.values()
。但是在那一点上,为什么不首先放一个
list
(或
tuple
)呢?如果您完全确定已按正确的顺序获取了所有值,并且希望按顺序而不是按名称引用它们,那么您拥有的是一个
list
,而不是一个
dict

而且,没有办法绑定SQL中的列名(或表名等),仅绑定值。

当然,您可以动态生成SQL语句。例如:

columns = ', '.join(values.keys())placeholders = ', '.join('?' * len(values))sql = 'INSERT INTO Media ({}) VALUES ({})'.format(columns, placeholders)cur.execute(sql, values.values())

但是,这几乎总是一个坏主意。这确实比生成和

exec
编写动态Python代码更好。你只不过是失去了所有的从SQL注入攻击的首位,主要是保护使用占位符的好处,但也喜欢更快的编译,更好的缓存,等DB引擎中并不重要的事情。

最好退一步并从更高的角度来看这个问题。例如,也许您并不是真的想要一个静态的属性列表,而是一个名称-值

MediaProperties
表?或者,也许您想要某种基于文档的存储(无论是功能强大的nosql系统,还是仅存储在中的一堆JSON或YAML对象
shelve
)?


使用命名占位符的替代方法:

columns = ', '.join(my_dict.keys())placeholders = ':'+', :'.join(my_dict.keys())query = 'INSERT INTO my_table (%s) VALUES (%s)' % (columns, placeholders)print querycur.execute(query, my_dict)con.commit()


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5649296.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存