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

2024-04-19 14:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某些原因,我希望对字符串值进行显式引用(成为构造的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提供了这样的功能?我不想自己写这样的函数。。。


Tags: from功能fieldexecutestringvaluetablesome
3条回答

我猜你在找mogrify函数。

示例:

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

好吧,所以我很好奇,就去看看精神病2的源头。原来我不需要再深入到示例文件夹:)

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

from psycopg2.extensions import adapt

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

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

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

如果你有你想做的事情的对象,你可以创建一个符合'IPsycopgSQLQuote'协议的适配器(参见pydocs的myfirstrecipe.py示例…实际上这是我能找到的唯一引用该名称)引用你的对象,然后像这样注册它:

from psycopg2.extensions import register_adapter

register_adapter(mytype, myadapter)

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

你应该尽量避免自己引用。正如人们所指出的,它不仅是特定于数据库的,而且引用中的缺陷也是SQL注入错误的根源。

如果不想分别传递查询和值,请传递参数列表:

def make_my_query():
    # ...
    return sql, (value1, value2)

def do_it():
    query = make_my_query()
    cursor.execute(*query)

(我可能有cursor.execute的语法错误)这里的要点是,仅仅因为cursor.execute有很多参数,并不意味着必须单独处理它们。你可以把它们作为一个列表来处理。

相关问题 更多 >