我正在尝试使用psycopg2
row1
是要添加到表中的列名列表。我可以手动完成,但当我尝试以编程方式执行此操作时,我收到错误。
for c in row1:
cur.execute("ALTER TABLE HHV2PUB ADD COLUMN %s text", (c,))
错误是:
cur.execute("ALTER TABLE HHV2PUB ADD COLUMN %s text", (c,))
psycopg2.ProgrammingError: syntax error at or near "'HOUSEID'"
LINE 1: ALTER TABLE HHV2PUB ADD COLUMN 'HOUSEID' text
我的猜测是它与单引号''
答案 0 :(得分:20)
从Psycopg 2.7开始,有一个安全的sql
module:
from psycopg2 import sql
query = sql.SQL("alter table t add column {} text")
row1 = ('col1', 'col2')
for c in row1:
cursor.execute(query.format(sql.Identifier(c)))
2.6及更早版本:
使用psycopg2.extensions.AsIs
import psycopg2
from psycopg2.extensions import AsIs
conn = psycopg2.connect("host=localhost4 port=5432 dbname=cpn")
cursor = conn.cursor()
query = "alter table t add column %s text"
row1 = ('col1', 'col2')
for c in row1:
cursor.execute(query, (AsIs(c),))
conn.commit()
答案 1 :(得分:6)
您不能将SQL参数用于 SQL对象名称。 SQL参数明确地引用值,以便它们不能被解释为这样;这是使用SQL参数的主要原因之一否则。
你必须在这里使用字符串插值。 非常小心您没有使用用户输入来生成c
:
for c in row1:
cur.execute("ALTER TABLE HHV2PUB ADD COLUMN %s text" % c)
Psycopg2确实为您提供了一种方法,可以使用psycopg2.extensions.AsIs()
将参数标记为“已经转义”,但目的是将其用于已转义的数据。
更好的想法是使用psycopg2.sql
extension来管理正确的标识符转义:
from psycopg2 import sql
for c in row1:
cur.execute(
sql.SQL("ALTER TABLE HHV2PUB ADD COLUMN {} text").format(
sql.Identifier(c)))