我目前正在尝试在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 =的占位符格式。
safely specifying 'order by' clause from user input in python / postgresql / psycopg2
有没有人知道这个sql查询的正确占位符语法?谢谢!
答案 0 :(得分:2)
限制和偏移都可以与占位符一起使用而没有任何问题。
一般来说,只要表达式中允许“值”,就可以使用占位符。
cur.execute("select * from node where node_name = %s limit %s offset %s", ('test', 5, 5))
工作得很好。
正如在引用文章中已经提到的,您不能使用占位符来引用其中任何一个的表,列,模式或别名。在这些情况下,您通常需要在调用execute之前执行自己的变量替换。
答案 1 :(得分:0)
在非常旧版本的PostgreSQL中,确实无法在LIMIT
和OFFSET
子句中使用占位符。此功能已在7.4版中添加,因此可以安全地假设它存在于当前安装中。
但这仅适用于服务器端预处理语句。 Psycopg不使用服务器端预处理语句。它执行自己的字符串替换,并将结果字符串作为常量发送到后端。所以原则上,你可以在任何地方使用它的参数替换功能,因为结果文字在语法上是有效的。
所以你提出的建议无论如何都是好的。