当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何显式引用字符串值(PythonDBAPI/Psycopg2)》经验,为你挑选了2个好方法。

出于某些原因,我想明确引用字符串值(成为构造的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文档中找不到这样的功能).如果没有,也许Psycopg2提供这样的功能?如果没有,也许Django提供这样的功能?我不想自己写这样的功能......



1> Henrik Gusta..:

好的,所以我很好奇,然后去看看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)

此外,其他例子很有趣; ESP.' dialtone.py'和'simple.py'.



2> Beli..:

我想你正在寻找mogrify功能.

例:

>>> cur.mogrify("INSERT INTO test (num, data) VALUES (%s, %s)", (42, 'bar'))
"INSERT INTO test (num, data) VALUES (42, E'bar')"

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有