如何显式引用字符串值 (Python DB API/Psycopg2)

2024-03-30

由于某些原因,我想对字符串值进行显式引用(成为构造的 SQL 查询的一部分),而不是等待由cursor.execute方法的第二个参数的内容。

我所说的“隐含引用”是指:

value = "Unsafe string"
query = "SELECT * FROM some_table WHERE some_char_field = %s;"
cursor.execute( query, (value,) ) # value will be correctly quoted

我更喜欢这样的东西:

value = "Unsafe string"
query = "SELECT * FROM some_table WHERE some_char_field = %s;" % \
    READY_TO_USE_QUOTING_FUNCTION(value)
cursor.execute( query ) # value will be correctly quoted, too

水平这么低吗READY_TO_USE_QUOTING_FUNCTIONPython DB API 规范所期望的(我在PEP 249 http://www.python.org/dev/peps/pep-0249/文档)。如果没有的话,也许Psycopg2提供了这样的功能?如果没有的话,也许Django提供了这样的功能?我不想自己写这样的函数......


好吧,所以我很好奇,就去查看了 psycopg2 的源代码。事实证明我不需要比示例文件夹更进一步:)

是的,这是 psycopg2 特有的。基本上,如果你只想引用一个字符串,你可以这样做:

from psycopg2.extensions import adapt

print adapt("Hello World'; DROP DATABASE World;")

但您可能想要做的是编写并注册您自己的适配器;

在 psycopg2 的示例文件夹中,您可以找到该文件'我的第一个食谱.py' http://sourcecodebrowser.com/psycopg2/2.4.5/myfirstrecipe_8py_source.html有一个示例说明如何以特殊方式强制转换和引用特定类型。

如果您有想要执行的操作的对象,则可以创建一个符合“IPsycopgSQLQuote”协议的适配器(请参阅 pydocs 中的 myfirstrecipe.py-example...实际上,这是我能找到的对该名称的唯一引用)引用您的对象,然后像这样注册它:

from psycopg2.extensions import register_adapter

register_adapter(mytype, myadapter)

另外,其他例子也很有趣;尤其是'拨号音.py' http://sourcecodebrowser.com/psycopg2/2.4.5/dialtone_8py_source.html and '简单.py' http://sourcecodebrowser.com/psycopg2/2.4.5/simple_8py_source.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何显式引用字符串值 (Python DB API/Psycopg2) 的相关文章

随机推荐