【问题标题】:Query format with f-string使用 f 字符串的查询格式
【发布时间】: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


【解决方案1】:

出于好奇,您应该意识到您已将这些转换为str,将dict_keys/values 的表示插入f-string

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

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

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

【讨论】:

  • 我试过这个 `INSERT INTO user ('id', 'field2') values ('1', 'value2') ` - 字段名称周围有单引号,它会引发语法错误. ` "'id'" 第 1 行或附近的语法错误:INSERT INTO user ('id', `.
  • 顺便说一句,这是一个很酷的结构:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多