Python AsIs和sql模块之间的psycopg2差异

Python AsIs和sql模块之间的psycopg2差异,python,psycopg2,string-concatenation,query-parameters,string-interpolation,Python,Psycopg2,String Concatenation,Query Parameters,String Interpolation,要在查询中动态选择表名,我使用psycopg2.extensions中的AsIs,语法如下: cur.execute("SELECT * FROM %s WHERE id = %s;", (AsIs('table_name'), id)) from psycopg2 import sql cur.execute( sql.SQL("SELECT * FROM {} WHERE id = %s;") .format(sql.Identifier('table_name'

要在查询中动态选择表名,我使用psycopg2.extensions中的AsIs,语法如下:

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

cur.execute(
    sql.SQL("SELECT * FROM {} WHERE id = %s;")
        .format(sql.Identifier('table_name')), (id, )
但是,文档现在建议使用版本2.7中提供的新psycopg2.sql模块,其语法如下:

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

cur.execute(
    sql.SQL("SELECT * FROM {} WHERE id = %s;")
        .format(sql.Identifier('table_name')), (id, )
除了sql模块公开的对象可以直接传递到执行之外,这两个选项之间有什么区别?

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

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