python - Problema para insertar usando psycopg
postgresql matlab (1)
Estoy leyendo datos de un archivo .mat usando el módulo Pytables. Después de leer los datos, quiero insertar estos datos en la base de datos usando psycopg. Aquí hay una pieza de código de muestra:
file = tables.openFile(matFile)
x = 0
#populate the matData list
for var in dest:
data = file.getNode(''/'' + var)[:]
matData.append(data)
x = x+1
#insert into db
for i in range(0,x):
cur.execute("""INSERT INTO /"%s/" (%s) VALUES (%s)""" % tableName,dest[i],matData[i]) )
Estoy teniendo el siguiente error:
Traceback (most recent call last):
File "./loadDBFromMAT.py", line 111, in <module>
readInputFileAndLoad(args.matFileName,args.tableName)
File "./loadDBFromMAT.py", line 77, in readInputFileAndLoad
cur.execute("INSERT INTO /"%s/" (%s) VALUES (%s)" % (tableName,dest[i],matData[i]) )
psycopg2.ProgrammingError: syntax error at or near "["
LINE 1: INSERT INTO "DUMMY1km" (data) VALUES ([[-3000 -3000 -3000 .....
Sería genial si alguien puede sugerir una solución para esto. ¡Gracias!
La INSERT
tiene una sintaxis no válida. Hay algo mal dentro del bucle for que mencionas.
Debe incluir el ciclo for en la pregunta.
INSERT INTO "DUMMY1km" (data) VALUES ([[-3000 -3000 -3000 .....)
Una declaración válida podría verse así: suponiendo que su columna es de tipo integer[]
.
... que también deberías incluir en la pregunta.
INSERT INTO "DUMMY1km"(data) VALUES (''{-3000, -3000}''::int[])
o
INSERT INTO "DUMMY1km"(data) VALUES (ARRAY[-3000, -3000]) -- note the "ARRAY"
o para una matriz bidimensional (se parece un poco a eso en el mensaje de error):
INSERT INTO "DUMMY1km"(data) VALUES (''{{-3000, -3000}, {-3000, -3000}}''::int[])
o
INSERT INTO "DUMMY1km"(data) VALUES (ARRAY[[-3000, -3000],[-3000, -3000]])
Más sobre entrada de valor de matriz en el manual.
Es decir:
matData [i] necesita contener ARRAY[-3000, -3000]
o una de las otras variantes enumeradas de sintaxis válida en lugar de [[-3000 -3000 -3000 ...
que no es válida para una matriz de enteros.
Psychopg convierte automáticamente una matriz de PostgreSQL en una lista de Python . Al compilar INSERT, necesita convertir la lista a una matriz. Cito desde aquí :
Python lists are converted into PostgreSQL ARRAYs: >>> cur.mogrify("SELECT %s;", ([10, 20, 30], )) ''SELECT ARRAY[10, 20, 30];''
Descargo de responsabilidad: soy un experto con PostgreSQL, no tanto con Python. Para alguien que conoce Python mejor que yo, debería ser fácil formatear la cadena en consecuencia. Encontré la cita anterior en una búsqueda rápida en la web.