栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/647096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号