psycopg2 AsIs 和 sql 模块之间的区别

Ant*_*aux 5 python psycopg2 string-concatenation string-interpolation

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

cur.execute("SELECT * FROM %s WHERE id = %s;", (AsIs('table_name'), id))
Run Code Online (Sandbox Code Playgroud)

但是,文档现在建议使用psycopg2.sql2.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, )
Run Code Online (Sandbox Code Playgroud)

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

pir*_*iro 7

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

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