要在我曾使用AsIs()
(http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.AsIs)psycopg2.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()
之外,这两个选项之间的区别是什么?
答案 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
仅用于参数值:如果当前工作主要是实施事故,将来行为可能会发生变化。查询值不应用于表示查询的可变部分,例如表或字段名称。