使用psycopg插入时的问题

0 投票
1 回答
1625 浏览
提问于 2025-04-17 03:49

我正在使用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 的人来说,格式化字符串应该很简单。我在网上快速查找时找到了上面的引用。

撰写回答