python - consultar - Pasar el nombre de la columna como parámetro a PostgreSQL usando psycopg2
psycopg2 connect (2)
No puede usar parámetros SQL para nombres de objetos SQL . Los parámetros de SQL citan valores explícitamente para que no se puedan interpretar como tales; esa es una de las principales razones para usar los parámetros de SQL de lo contrario .
Tendrás que usar la interpolación de cadenas aquí. Tenga mucho cuidado de no utilizar la información del usuario para producir c
aquí:
for c in row1:
cur.execute("ALTER TABLE HHV2PUB ADD COLUMN %s text" % c)
Psycopg2 te da un método para marcar los parámetros como ''ya escapó'' con psycopg2.extensions.AsIs()
, pero la intención es que esto se use en datos ya escapados.
Una idea mucho mejor es usar la extensión psycopg2.sql
para gestionar el escapado del identificador correcto:
from psycopg2 import sql
for c in row1:
cur.execute(
sql.SQL("ALTER TABLE HHV2PUB ADD COLUMN {} text").format(
sql.Identifier(c)))
Estoy tratando de agregar columnas a una tabla usando psycopg2
row1
continuación es una lista de nombres de columnas para agregar a la tabla. Puedo hacerlo manualmente pero cuando trato de hacerlo programáticamente recibo un error.
for c in row1:
cur.execute("ALTER TABLE HHV2PUB ADD COLUMN %s text", (c,))
El error es:
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
Supongo que tiene algo que ver con las comillas simples ''''
A partir de Psycopg 2.7 existe el módulo seguro 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)))
Con 2.6 y anterior:
Use 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()