使用psycopg插入时的问题
我正在使用Pytables模块从一个.mat文件中读取数据。读取完数据后,我想用psycopg把这些数据插入到数据库里。这里有一段示例代码:
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]) )
但是我遇到了以下错误:
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 .....
如果有人能提供一个解决办法,那就太好了。谢谢!
1 个回答
2
这个 INSERT
语句的语法不对。在你提到的 for 循环里有问题。
你应该把 for 循环的部分也放到问题里。
插入到 "DUMMY1km" 表中的数据是这样的:VALUES ([[-3000 -3000 -3000 .....
一个有效的语句可能是这样的 - 假设你的列类型是 integer[]
。
... 你也应该把这个信息放到问题里。
INSERT INTO "DUMMY1km"(data) VALUES ('{-3000, -3000}'::int[])
或者
INSERT INTO "DUMMY1km"(data) VALUES (ARRAY[-3000, -3000]) -- note the "ARRAY"
如果是二维数组(错误信息里看起来有点像这个):
INSERT INTO "DUMMY1km"(data) VALUES ('{{-3000, -3000}, {-3000, -3000}}'::int[])
或者
INSERT INTO "DUMMY1km"(data) VALUES (ARRAY[[-3000, -3000],[-3000, -3000]])
关于 数组值输入 的更多信息可以在手册里找到。
总结:
matData[i] 需要包含 ARRAY[-3000, -3000]
或者其他有效语法的变体,而不是 [[-3000 -3000 -3000 ...
,因为这对整数数组来说是不合法的。
Psychopg 会自动把 PostgreSQL 数组 转换成 Python 列表。在构建 INSERT 语句时,你需要把列表再转换回数组。我在 这里 找到的引用:
Python lists are converted into PostgreSQL ARRAYs: >>> cur.mogrify("SELECT %s;", ([10, 20, 30], )) 'SELECT ARRAY[10, 20, 30];'
声明:我对 PostgreSQL 很熟,但对 Python 了解不多。对于比我更懂 Python 的人来说,格式化字符串应该很简单。我在网上快速查找时找到了上面的引用。