【问题标题】:psycopg2 difference between AsIs and sql moduleasIs和sql模块之间的psycopg2区别
【发布时间】:2017-08-14 08:17:01
【问题描述】:

要在查询中动态选择表名,我曾经使用 AsIs() from psycopg2.extensions ( http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.AsIs ),语法如下:

cur.execute("SELECT * FROM %s WHERE id = %s;", (AsIs('table_name'), id))

但是,文档现在建议使用 2.7 版 (http://initd.org/psycopg/docs/sql.html#module-psycopg2.sql) 中提供的新 psycopg2.sql 模块,语法如下:

from psycopg2 import sql

cur.execute(
    sql.SQL("SELECT * FROM {} WHERE id = %s;")
        .format(sql.Identifier('table_name')), (id, )

除了sql 模块公开的对象可以直接传递给execute() 之外,这两个选项有什么区别?

【问题讨论】:

    标签: python psycopg2 string-concatenation query-parameters string-interpolation


    【解决方案1】:

    AsIs 是……就这样。如果表名包含需要引用的字符,它不会执行任何转义。 sql 模块中的对象反而知道an identifier 是什么。

    更巧妙的是,AsIs 仅用于参数值:如果当前有效,则主要是实现事故,并且将来行为可能会改变。查询值不应用于表示查询的可变部分,例如表或字段名称。

    【讨论】:

      猜你喜欢
      • 2015-01-11
      • 1970-01-01
      • 2020-03-08
      • 2017-07-06
      • 2011-06-18
      • 2011-05-05
      • 1970-01-01
      • 2012-09-02
      • 2013-11-29
      相关资源
      最近更新 更多