【问题标题】:Python: get escaped SQL stringPython:获取转义的 SQL 字符串
【发布时间】:2011-03-07 21:43:05
【问题描述】:

当我有一个游标时,我知道我可以安全地执行如下查询:

cur.execute("SELECT * FROM foo WHERE foo.bar = %s", (important_variable,))

有什么方法可以在不执行查询的情况下安全地获取字符串?例如,如果important_variable 是一个字符串,比如"foo 'bar' \"baz",我想要适当转义的:

"SELECT * FROM foo WHERE foo.bar = "foo \'bar\' \"baz"

(或任何适当的转义,我什至不确定)。

我正在使用 psycopg 和 sqlobject。

【问题讨论】:

  • 如果 important_variabledatetime.date(2000,1,1) 那么我认为 Claudiu 想要一个返回字符串 "SELECT * FROM foo WHERE foo.bar = '2000-1-1'" 的函数
  • 实际上在这种情况下不涉及转义 - 驱动程序分别发送参数化语句和参数。如果您使用的是 psycopg2,请检查 psycopg2.extensions.QuotedString

标签: python database postgresql sqlobject


【解决方案1】:

您还没有告诉我们您使用的是什么库或数据库,但我认为您的问题在这里得到了回答:How to quote a string value explicitly (Python DB API/Psycopg2)

【讨论】:

  • 似乎正是我所需要的!
【解决方案2】:

查看游标的 mogrify 方法——它将在变量绑定后返回字符串并显示它所做的任何引用

cur.mogrify("SELECT * FROM foo WHERE foo.bar = %s", ("foo 'bar' \"baz",))

【讨论】:

  • 另请注意,您找到的任何方法都是特定于连接器的。 DB API 没有定义生成转义 SQL 字符串的标准方法。这是合适的,因为连接器不一定会在客户端构建整个字符串。有些能够将查询模板和值分别发送到服务器。
  • 但是..如果我想变形呢?
【解决方案3】:

SQLObject 自行处理转义/引用,但如果您想使用该功能:

from sqlobject.converters import sqlrepr
print(sqlrepr('SELECT * FROM foo WHERE foo.bar = "foo \'bar\' \"baz', 'postgres'))

结果:

'SELECT * FROM foo WHERE foo.bar = "foo ''bar'' "baz'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多