Python 使用f字符串的查询格式

Python 使用f字符串的查询格式,python,mysql,python-3.6,f-string,Python,Mysql,Python 3.6,F String,我有非常大的字典,我想插入到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 ('

我有非常大的字典,我想插入到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]))"

有什么提示吗?

出于好奇,您应该意识到您已经将这些提示转换为
str
,将
dict\u键/值的表示形式插入到
f字符串中

您可以强制转换为元组,然后插入:

cols = tuple(bigd.keys())
vals = tuple(bigd.values())
q = f"INSERT INTO table {cols} values {vals}"

但是,正如评论所指出的,这不是一种安全的方法。

您根本不应该使用字符串格式形成查询字符串,它会使您面临注入攻击。阅读您正在使用的数据库引擎的文档,这些文档告诉您如何在查询中放置占位符并让占位符进行格式化。@jornsharpe感谢您的提示。将切换到占位符。但是,对于其他类似的应用程序,有没有办法去掉那些“dict_键”,这些应用程序将在字符串周围保留引号,而在int周围不保留引号。问题是,您从一开始就采用了一种幼稚的方式,弄乱了列表文本的字符串<代码>“,”。join(map(repr,随便什么))
更整洁,可以继续工作。@jornsharpe是的。谢谢