使用psycopg2将列名作为参数传递给PostgreSQL

2024-05-16 04:39:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用psycopg2将列添加到表中

下面是要添加到表中的列名列表。我可以手动操作,但当我试图用编程的方式操作时,我会得到一个错误。

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

我猜这和单引号有关


Tags: textadd列表execute编程错误tablecolumn
2条回答

从Psycopg 2.7开始,有一个保险箱^{} 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

Adapter conform to the ISQLQuote protocol useful for objects whose string representation is already valid as SQL representation.

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()

不能对SQL对象名使用SQL参数。SQL参数显式引用值,这样就不能将它们解释为这样;这是使用SQL参数的主要原因之一。

这里必须使用字符串插值。要特别小心,不要使用用户输入在这里生成c

for c in row1:
    cur.execute("ALTER TABLE HHV2PUB ADD COLUMN %s text" % c)

Psycopg2确实为您提供了一个用^{}将参数标记为“已转义”的方法,但其目的是将此方法用于已转义的数据

更好的方法是使用^{} extension来管理正确的标识符转义:

from psycopg2 import sql

for c in row1:
    cur.execute(
        sql.SQL("ALTER TABLE HHV2PUB ADD COLUMN {} text").format(
            sql.Identifier(c)))

相关问题 更多 >