psycopg2 AsIs和sql模块之间的区别
问题内容:
为了在查询中动态地选择一个表名,我曾经使用以下语法AsIs()
在psycopg2.extensions
(http://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
是,仅用于参数值:如果当前工作主要是实现事故,并且将来行为可能会改变。查询值不应用于表示查询的可变部分,例如表或字段名称。