【问题标题】:Adding single quotes in string around curly braces - Python [duplicate]在花括号周围的字符串中添加单引号 - Python [重复]
【发布时间】:2018-11-17 21:48:05
【问题描述】:

当我运行以下命令时:

table = cfg_pre + '_' + cfg_tbl
check_data = 'SELECT COUNT(*) FROM X WHERE TABLE_NM = {}'.format(table)

我得到以下信息:

SELECT COUNT(*) FROM X WHERE TABLE_NM = ABC_123

我需要的是:

SELECT COUNT(*) FROM X WHERE TABLE_NM = 'ABC_123'

否则 SQL 将不会执行。有什么想法吗?

【问题讨论】:

  • 您不应该使用字符串格式来创建 SQL 查询。让您容易受到 SQL 注入的攻击。
  • 谢谢...您对此有更好的建议吗?
  • 让您选择的 DB 驱动程序准备您的语句,但通常:"whatever '{}' else".format("foo bar") 将导致 whatever 'foo bar' else
  • 我假设您想要执行这些 SQL 语句。如果您真的只想在该值周围生成一个带有单引号的字符串,请告诉我,我会重新打开。或者找一个更合适的骗子。

标签: python sql string


【解决方案1】:

使用双语音标记而不是单语音标记:

"SELECT COUNT(*) FROM X WHERE TABLE_NM = '{}'".format(table)

这并不完全相关(与其说是必要的话,不如说是精细),但如果您使用的是 Python3.6,您也可以使用 f-strings(但您仍然需要双语音标记)。

【讨论】:

    【解决方案2】:

    如果您使用的是 Python 3.6,则 f-strings 是一个 f-un 解决方案。最终,您需要使用双引号将单引号括起来。

    table = f'{cfg_pre}_{cfg_tbl}'
    check_data = f"SELECT COUNT(*) FROM X WHERE TABLE_NM = '{table}'"
    

    【讨论】:

    • 虽然是的,这实现了所需的输出,但这不是生成查询的安全方式。
    • f-strings 很酷,但也与这个问题无关。在您的答案中实际解决问题的是在字符串文字上使用双引号,因此您可以在字符串中使用单引号 - 与 Adi219 的答案完全相同,只是他解释了它,而您解释了一些不相关的东西。
    • OP 没有问如何创建安全的动态查询,他问的是如何添加单引号。
    • 仅仅因为有人要求不好的建议而给出不好的建议仍然是不好的建议。
    • 但这不仅仅是 OP 想要什么......它是关于以最佳安全性/效率/优化/等实现 OP 想要的。
    【解决方案3】:

    虽然 SQL 注入是您使用变量创建查询时可能遇到的问题,但解决方案是转义字符或更改引号。

    table = cfg_pre + '_' + cfg_tbl
    check_data = "SELECT COUNT(*) FROM X WHERE TABLE_NM = '{}'".format(table)
    

    或者

    table = cfg_pre + '_' + cfg_tbl
    check_data = 'SELECT COUNT(*) FROM X WHERE TABLE_NM = \'{}\''.format(table)
    

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 2017-10-07
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2023-01-29
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多