psycopg - 获取格式化的 SQL 而不是执行
我有一段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中,有几种游标类,只有 ClientCursor
和 AsyncClientCursor
这两个类有 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',) )