由于某些原因,我想对字符串值进行显式引用(成为构造的SQL查询的一部分),而不是等待cursor.execute方法对其第二个参数的内容执行隐式引用。
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文档中找不到这样的功能)。如果没有,也许Psycopg2提供了这样的功能?如果没有,也许Django提供了这样的功能?我不想自己写这样的功能…
READY_TO_USE_QUOTING_FUNCTIONPython DB API
好的,所以我很好奇,然后去看看psycopg2的来源。事实证明,我不必比示例文件夹更进一步:)
是的,这是psycopg2特有的。基本上,如果你只想引用字符串,则可以执行以下操作:
from psycopg2.extensions import adapt print adapt("Hello World'; DROP DATABASE World;")
但是,你可能想做的就是编写和注册自己的适配器。
在psycopg2的examples文件夹中,你找到文件“ myfirstrecipe.py”,其中有一个示例,介绍了如何以特殊方式强制转换和引用特定类型。
如果你有想要做的事情的对象,则可以创建一个符合“ IPsycopgSQLQuote”协议的适配器(有关myfirstrecipe.py-example的信息,请参阅pydocs …实际上,这是我可以找到的唯一参考名称) )引用你的对象,然后像这样注册它:
from psycopg2.extensions import register_adapter register_adapter(mytype, myadapter)