psycopg - 获取格式化的 SQL 而不是执行

19 投票
3 回答
12073 浏览
提问于 2025-04-16 21:59

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

所有的资料都警告我们不要自己去格式化SQL语句,而是建议让驱动程序来处理。例如:

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

然后,驱动程序会格式化这个SQL字符串。假设我不想执行任何操作,只是想要一个完全格式化的SQL字符串。psycopg模块有没有什么功能可以获取这个格式化后的SQL呢?

3 个回答

1

编辑:看起来下面的内容不太准确,psycopg 并没有使用PQexecParams,但计划会使用(请看我下面的评论)。我保留这个答案,因为它是一个有用的抽象,适用于大多数参数化查询,只是目前对psycopg2来说还不适用。


其实,驱动程序并不会格式化字符串。你使用的叫做参数化查询:SQL字符串和参数会按照你指定的方式直接发送给Postgres,Postgres会解析这个模板字符串,然后把参数插入到解析树中。这样,参数就不需要被编码 解码,因此就不会出现编码错误、故障或注入攻击的风险。另一方面,这意味着在代码中并没有你所寻找的格式化过程。

想了解更多细节,可以查看libpq文档中的“PQexecParams”方法 - libpq是Postgres的C语言客户端接口库。

2

在psycopg 3中,有几种游标类,只有 ClientCursorAsyncClientCursor 这两个类有 mogrify 方法。如果你想使用 mogrify,你需要在 connect 函数中使用 cursor_factory=ClientCursor,或者你需要像下面这样实例化 (Async)ClientCursor

psycopg.ClientCursor(conn).mogrify(query, (param1, param2))

更多详细信息

25

你可以使用函数 curs.mogrify():

SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )

撰写回答