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

8yoxcaq7  于 2023-05-12  发布在  PostgreSQL
关注(0)|答案(3)|浏览(178)

我有一段Python代码,它通过psycopg与PostgreSQL数据库交互。
所有的文献都警告不要自己做sql格式化,并建议让驱动程序来做。例如:

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

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

lp0sw83n

lp0sw83n1#

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

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

1aaf6o9v2#

edit:看起来下面的内容不太正确,psycopg * 不 * 使用PQexecParams,但正计划使用(见下面的评论)。留下answer是因为它是一个有用的抽象,对大多数参数化查询都是正确的,只是显然还不是psycopg 2。
实际上,驱动程序不会格式化字符串。这里使用的是参数化查询:sql字符串和参数被发送到postgres,postgres解析模板字符串,然后将参数插入到解析树中。这样,参数就不必进行编码 * 或 * 解码,因此没有任何编码错误,毛刺或注入攻击的机会。OTOH,这意味着代码中没有任何地方像你正在寻找的格式化例程一样。
有关更多详细信息,请参阅libpq文档中的“PQexecParams”方法- libpq是Postgres的C级客户端接口库。

2mbi3lxu

2mbi3lxu3#

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

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

更多详情

相关问题