
如果您尝试使用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()
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)