18

我有一段 Python 代码,它通过 psycopg 与 PostgreSQL 数据库交互。

所有文献都警告不要自己进行sql格式化,并建议让驱动程序去做。例如:

cur.execute('select name, age from people where name = %s;', ('ann',) )

然后驱动程序格式化 sql 字符串。假设我不想执行任何东西,但我只想要完全格式化的 sql 字符串。是否有任何功能可以在 psycopg 模块中获取此格式化的 sql?

4

2 回答 2

22

你会使用函数 curs.mogrify():

SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )
于 2011-07-21T12:27:32.507 回答
1

编辑:看起来以下内容不太正确,psycopg使用 PQexecParams,但计划使用(请参阅下面的评论)。留下答案是因为它是一个有用的抽象,并且对于大多数参数化查询都是如此,但显然还不是 psycopg2。


实际上,驱动程序不会格式化字符串。您在那里使用的称为参数化查询:sql 字符串和参数完全按照您指定的方式“通过网络”发送到 postgres,postgres 解析模板字符串,然后将参数插入到解析树中。这样,就不必对参数进行编码解码,因此不会出现任何编码错误、故障或注入攻击。OTOH,这意味着代码中没有任何类似于您正在寻找的格式化例程的东西。

更多详细信息,请参阅libpq文档中的“PQexecParams”方法——libpq是 Postgres 的 C 级客户端接口库。

于 2011-07-21T11:51:29.450 回答