6

我目前正在尝试在 Python 的 psycopg 模块中的 PostgreSQL 查询中使用占位符。这是我正在使用的代码示例。

table.execute('SELECT * FROM table WHERE col2 = %s ORDER BY pID ASC LIMIT %s OFFSET %s;',(val1,val2,val3))

我在某处读到不可能将这样的占位符用于 LIMIT 和 OFFSET 但是我应该将这种占位符格式用于 WHERE =。

从 python / postgresql / psycopg2 中的用户输入安全地指定“order by”子句

有谁知道这个 sql 查询的正确占位符语法?谢谢!

4

2 回答 2

5

限制和偏移都可以与占位符一起使用,没有任何问题。

一般来说,您可以在表达式中允许“值”的任何地方使用占位符。

cur.execute("select * from node where node_name = %s limit %s offset %s", ('test', 5, 5))

工作得很好。

正如引用的文章中已经指出的那样,您不能使用占位符来引用表、列、模式或其中任何一个的别名。在这些情况下,您通常需要在调用执行之前进行自己的变量替换。

于 2013-01-28T03:39:12.637 回答
0

在非常旧的 PostgreSQL 版本中,确实不可能在LIMITandOFFSET子句中使用占位符。此功能是在 7.4 版中添加的,因此可以安全地假设它存在于当前安装中。

但这仅适用于服务器端准备好的语句。Psycopg 不使用服务器端准备好的语句。它自己进行字符串替换,并将生成的字符串作为常量发送到后端。所以原则上,你可以在任何地方使用它的参数替换功能,结果文字在语法上是有效的。

因此,无论哪种方式,您建议做的事情都很好。

于 2013-01-28T16:10:29.777 回答