【问题标题】:Python Pyscopg: How do I use place holders with LIMIT/OFFSET and WHERE?Python Pyscopg:如何在 LIMIT/OFFSET 和 WHERE 中使用占位符?
【发布时间】:2012-12-15 00:03:53
【问题描述】:

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

【问题讨论】:

  • 我在psycopg2 docs 上没有看到关于在 SQL 查询的 ORDER BY 部分中使用占位符的任何内容。此外,作为you referenced already,如果您想使用占位符和ORDER BY,则需要进行自己的格式化。
  • 是的,我已经浏览了文档 =/ 我的印象是不建议手动进行自己的 SQL 格式化

标签: python postgresql psycopg2


【解决方案1】:

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

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

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

工作得很好。

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

【讨论】:

  • 要让标识符或表达式占位符检查my answer
【解决方案2】:

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

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

所以无论哪种方式,你提议做的都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2013-04-13
    • 1970-01-01
    • 2012-10-06
    • 2017-12-25
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多