我有一段 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?
你会使用函数 curs.mogrify():
SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )
编辑:看起来以下内容不太正确,psycopg不使用 PQexecParams,但计划使用(请参阅下面的评论)。留下答案是因为它是一个有用的抽象,并且对于大多数参数化查询都是如此,但显然还不是 psycopg2。
实际上,驱动程序不会格式化字符串。您在那里使用的称为参数化查询:sql 字符串和参数完全按照您指定的方式“通过网络”发送到 postgres,postgres 解析模板字符串,然后将参数插入到解析树中。这样,就不必对参数进行编码或解码,因此不会出现任何编码错误、故障或注入攻击。OTOH,这意味着代码中没有任何类似于您正在寻找的格式化例程的东西。
更多详细信息,请参阅libpq文档中的“PQexecParams”方法——libpq是 Postgres 的 C 级客户端接口库。