psycopg2 AsIs和sql模块之间的区别

时间:2017-03-22 09:45:58

标签: python psycopg2 string-concatenation query-parameters string-interpolation

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

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()之外,这两个选项之间的区别是什么?

1 个答案:

答案 0 :(得分:3)

var fs = require('fs'); var path = "C:\\somedir"; var watcher = fs.watch(path, function (event, filename) { console.log('event is: ' + event); if (filename) { console.log('filename provided: ' + filename); } else { console.log('filename not provided'); } }); watcher.on('error', function(err) { if (!fs.existsSync(path)) { console.log('folder deleted'); } }); 是...原样。如果表名包含需要引用的字符,它将不会执行表名的任何转义。 AsIs模块中的对象反而知道什么是an identifier

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