为此目的创建了新的sql 模块,并在 psycopg2 版本 2.7 中添加。根据文档:
如果您需要动态生成 SQL 查询(例如动态选择表名),您可以使用 psycopg2.sql 模块提供的工具。
文档中给出了两个示例:http://initd.org/psycopg/docs/sql.html
names = ['foo', 'bar', 'baz']
q1 = sql.SQL("insert into table ({}) values ({})").format(
sql.SQL(', ').join(map(sql.Identifier, names)),
sql.SQL(', ').join(sql.Placeholder() * len(names)))
print(q1.as_string(conn))
插入表(“foo”、“bar”、“baz”)值(%s、%s、%s)
q2 = sql.SQL("insert into table ({}) values ({})").format(
sql.SQL(', ').join(map(sql.Identifier, names)),
sql.SQL(', ').join(map(sql.Placeholder, names)))
print(q2.as_string(conn))
插入表(“foo”、“bar”、“baz”)值(%(foo)s、%(bar)s、%(baz)s)
根据 psycopg2 文档,虽然字符串连接会产生相同的结果,但不应将其用于此目的:
警告:从不、never、NEVER 使用 Python 字符串连接 (+) 或字符串参数插值 (%)将变量传递给 SQL 查询字符串。甚至在枪口下也没有。