Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python psycopg-获取格式化的sql而不是执行_Python_Postgresql_Psycopg - Fatal编程技术网

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

Python psycopg-获取格式化的sql而不是执行,python,postgresql,psycopg,Python,Postgresql,Psycopg,我有一段Python代码,它通过psycopg与PostgreSQL数据库交互 所有文献都警告不要自己进行sql格式化,并建议让驱动程序进行格式化。例如: cur.execute('select name, age from people where name = %s;', ('ann',) ) 然后,驱动程序格式化sql字符串。假设我不想执行任何操作,但我只想要完全格式化的sql字符串。在psycopg模块中是否有获取此格式化sql的功能?编辑:看起来以下内容不太正确,psycopg没有使

我有一段Python代码,它通过psycopg与PostgreSQL数据库交互

所有文献都警告不要自己进行sql格式化,并建议让驱动程序进行格式化。例如:

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

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

编辑:看起来以下内容不太正确,psycopg没有使用PQexecParams,但正计划使用(请参阅下面的评论)。留下答案是因为它是一个有用的抽象,对于大多数参数化查询都是如此,只是显然还不是psycopg2


实际上,驱动程序没有格式化字符串。您在那里使用的是所谓的参数化查询:sql字符串和参数完全按照您指定的方式“通过线路”发送给postgres,postgres解析模板字符串,然后将参数插入解析树。这样,就不必对参数进行编码或解码,因此不可能出现任何编码错误、小故障或注入攻击。OTOH,这意味着在代码中没有任何一点像您正在寻找的格式化例程


有关更多详细信息,请参阅文档中的“PQexecParams”方法-libpq是Postgres的C级客户端接口库

您将使用函数curs.mogrify():


需要注意的是,psycopg的作者认为mogrify只应用于调试目的。此mogrify函数需要DB API 2.0。可能此函数的输出有助于预结束“解释”并执行以查看执行计划?@ErikNinn Hansen pyscopg2实现DB API 2.0
mogrify
是一个psycopg2扩展。DBAPI2.0不是一个依赖项。哇,很有趣。这一定意味着,对于参数化查询,如果得到sql语法错误,它必须是代码本身,而不是字符串值中的一些奇怪字符?这就是我一直假设的工作方式-您可以安全地将其视为它的工作方式。但是,我刚刚检查完psycopg源代码,看起来他们正在处理客户端()上的模板格式化和字符串转义。虽然看起来他们正在努力尽可能使用PQexecParams-请参阅线程。只是为了让大家了解一点。。PQexecParams有一些限制,因此查询的客户端格式将保留下来。mogrify仅用于调试的主要原因是,我们无法保证其结果始终是发送到后端的精确查询(例如,如果我们切换到准备查询并使用PQexecParams)。
SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )