是否可以使用pymysql插入字典?
问题描述:
我有一个与数据库中的名称和列相同的字典。我可以按原样插入它,而不用重新编写INSERT INTO
语句,并重新使用所有列名称进行键入?是否可以使用pymysql插入字典?
UPDATE
的问题是关于pymysql
能力。您不需要编写代码,从字典中构建SQL
声明。
答
PyMySQL和其他DB-API 2.0 adapter一样;参数必须放置在SQL查询中作为位置或命名占位符。如果你想避免直接命名列,你必须以编程方式生成占位符。
当您使用%(name)s
参数语法时,PyMySQL支持使用参数字典执行查询。要从字典中生成插入语句,您可以使用:
def escape_name(s):
"""Escape name to avoid SQL injection and keyword *es.
Doubles embedded backticks, surrounds the whole in backticks.
Note: not security hardened, caveat emptor.
"""
return '`{}`'.format(s.replace('`', '``'))
names = list(dict_of_params)
cols = ', '.join(map(escape_name, names)) # assumes the keys are *valid column names*.
placeholders = ', '.join(['%({})s'.format(name) for name in names])
query = 'INSERT INTO TABLENAME ({}) VALUES ({})'.format(cols, params)
cursor.execute(query, dict_of_params)
为什么不在库中完成? – Dims
@Dims:为什么它应该是?你不能总是假定你有正确的列插入。如果您省略了必填列,该怎么办 –
与我在SQL中省略必需的列相同 – Dims