AsIs 和 sql 模块之间的 psycopg2 区别
psycopg2 difference between AsIs and sql module
要在查询中动态选择一个 table 名称,我曾经使用 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()
之外,这两个选项之间还有什么区别?
AsIs
是……原样。如果 table 名称包含需要引号的字符,它不会执行任何转义。 sql
模块中的对象反而知道什么是 an identifier.
更微妙的是,AsIs
仅适用于参数值:如果目前有效主要是实施事故,并且在未来行为可能会改变。不应使用查询值来表示查询的可变部分,例如 table 或字段名称。
要在查询中动态选择一个 table 名称,我曾经使用 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()
之外,这两个选项之间还有什么区别?
AsIs
是……原样。如果 table 名称包含需要引号的字符,它不会执行任何转义。 sql
模块中的对象反而知道什么是 an identifier.
更微妙的是,AsIs
仅适用于参数值:如果目前有效主要是实施事故,并且在未来行为可能会改变。不应使用查询值来表示查询的可变部分,例如 table 或字段名称。