psycopg2 AsIs和sql模块之间的区别


问题内容

为了在查询中动态地选择一个表名,我曾经使用以下语法AsIs()psycopg2.extensionshttp://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.AsIs)中使用该语法:

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

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

from psycopg2 import sql

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

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


问题答案:

AsIs是…原样。如果表名包含需要引用的字符,它将不会对表名进行任何转义。sql相反,模块中的对象知道什么是标识符

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