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

标签 python sql django psycopg2

出于某些原因,我想对字符串值进行显式引用(成为构造 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

是 Python DB API 规范所期望的低级 READY_TO_USE_QUOTING_FUNCTION(我在 PEP 249 文档中找不到这样的功能)。如果没有,也许 Psycopg2 提供了这样的功能?如果没有,也许 Django 提供了这样的功能?我不想自己写这样的函数......

最佳答案

好的,所以我很好奇,就去看了psycopg2的来源。原来我不必比示例文件夹走得更远:)

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

from psycopg2.extensions import adapt

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

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

在 psycopg2 的示例文件夹中,您可以找到文件 'myfirstrecipe.py'有一个如何以特殊方式强制转换和引用特定类型的示例。

如果你有你想做的事情的对象,你可以只创建一个符合“IPsycopgSQLQuote”协议(protocol)的适配器(请参阅 myfirstrecipe.py-example 的 pydocs...实际上这是我能找到的唯一引用到那个名字)引用你的对象,然后像这样注册它:

from psycopg2.extensions import register_adapter

register_adapter(mytype, myadapter)

另外,其他例子也很有趣;尤其是'dialtone.py''simple.py' .

关于python - 如何显式引用字符串值(Python DB API/Psycopg2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309945/

相关文章:

python - 我们如何在数组索引中使用 'and' 运算符?

python - 如何在 Django 更新语句中将字段设置为空

mysql - SQL 内部连接 ​​3 个具有不同主键的表

mysql - 使用myBatis在一个事务中运行多个sql语句

python - 未检测到静态文件 Django 1.10

python - 管理员中其他应用标签下的 Django 模型?

python - Anaconda 安装后,conda 命令失败并显示 "ImportError: no module named conda.cli"

c# - 如何比较两个gridview并忽略里面的数据顺序

python - 在django中使用注释引用相关对象

django - 如何获取 Elastic Beanstalk 实例中存储的文件?