【发布时间】:2016-12-18 16:34:46
【问题描述】:
我有一个非常大的字典,我想插入 MySQL 表。字典键是表中的列名。到目前为止,我正在构建这样的查询:
bigd = {'k1':'v1', 'k2':10}
cols = str(bigd.keys()).strip('[]')
vals = str(bigd.values()).strip('[]')
query = "INSERT INTO table ({}) values ({})".format(cols,vals)
print query
输出:
"INSERT INTO table ('k2', 'k1') values (10, 'v1')"
这适用于 Python2.7
但在 Python 3.6 中,如果我使用这样的字符串文字:
query = f"INSERT INTO table ({cols}) values ({vals})"
print(query)
它打印这个:
"INSERT INTO table (dict_keys(['k1', 'k2'])) values (dict_values(['v1', 10]))"
有什么建议吗?
【问题讨论】:
-
你不应该用字符串格式形成查询字符串,它会让你受到注入攻击。阅读您正在使用的数据库引擎的文档,其中告诉您如何通过在查询中放置占位符并让 它们 进行格式化来做到这一点。
-
@jonrsharpe 感谢您的提示。将切换到占位符。但是有没有办法为其他类似的应用程序摆脱那些“dict_keys”,这将保持字符串周围的引号而整数周围没有引号。
-
问题是你从一开始就用一种天真的方式来处理列表文字的字符串。
','.join(map(repr, whatever))更整洁并继续工作。 -
@jonrsharpe 是的。谢谢。
标签: python mysql python-3.6 f-string