我有一段Python代码,它通过psycopg与PostgreSQL数据库交互。
所有的文献都警告不要自己做sql格式化,并建议让驱动程序来做。例如:
cur.execute('select name, age from people where name = %s;', ('ann',) )
驱动程序然后格式化sql字符串。假设我不想执行任何东西,但我只想要完全格式化的sql字符串。在psycopg模块中是否有任何功能可以获取这个格式化的sql?
我有一段Python代码,它通过psycopg与PostgreSQL数据库交互。
所有的文献都警告不要自己做sql格式化,并建议让驱动程序来做。例如:
cur.execute('select name, age from people where name = %s;', ('ann',) )
驱动程序然后格式化sql字符串。假设我不想执行任何东西,但我只想要完全格式化的sql字符串。在psycopg模块中是否有任何功能可以获取这个格式化的sql?
3条答案
按热度按时间lp0sw83n1#
你可以使用curs.mogrify()函数:
1aaf6o9v2#
edit:看起来下面的内容不太正确,psycopg * 不 * 使用PQexecParams,但正计划使用(见下面的评论)。留下answer是因为它是一个有用的抽象,对大多数参数化查询都是正确的,只是显然还不是psycopg 2。
实际上,驱动程序不会格式化字符串。这里使用的是参数化查询:sql字符串和参数被发送到postgres,postgres解析模板字符串,然后将参数插入到解析树中。这样,参数就不必进行编码 * 或 * 解码,因此没有任何编码错误,毛刺或注入攻击的机会。OTOH,这意味着代码中没有任何地方像你正在寻找的格式化例程一样。
有关更多详细信息,请参阅libpq文档中的“PQexecParams”方法- libpq是Postgres的C级客户端接口库。
2mbi3lxu3#
在psycopg 3中有几个游标类,只有
ClientCursor
和AsyncClientCursor
有mogrify
方法。如果你想使用mogrify
,你需要在connect
函数中使用cursor_factory=ClientCursor
,或者你需要像这样示例化(Async)ClientCursor
:更多详情