繁体   English   中英

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

[英]Pass column name as parameter to PostgreSQL using psycopg2

我正在尝试使用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

我的猜测是它与单引号有关''

从Psycopg 2.7开始,有安全的sql模块

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

适配器符合ISQLQuote协议,该协议对字符串表示形式已作为SQL表示形式有效的对象很有用。

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确实为您提供了一种使用psycopg2.extensions.AsIs()将参数标记为“已经转义”的方法,但其目的是将其用于已转义的数据

一个更好的主意是使用psycopg2.sql扩展名来管理正确的标识符转义:

from psycopg2 import sql

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM