Python Psycopg:如何使用LIMIT / OFFSET和WHERE的占位符?

时间:2012-12-15 00:03:54

标签: python postgresql psycopg2

我目前正在尝试在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查询的正确占位符语法?谢谢!

2 个答案:

答案 0 :(得分:2)

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

一般来说,只要表达式中允许“值”,就可以使用占位符。

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

工作得很好。

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

答案 1 :(得分:0)

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

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

所以你提出的建议无论如何都是好的。