使用psycopg插入的问题

时间:2011-10-06 23:27:41

标签: python postgresql matlab psycopg2 pytables

我正在使用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 个答案:

答案 0 :(得分:1)

INSERT语句的语法无效。你提到的for循环里面有什么问题。
你应该在问题中加入for循环。

  

插入“DUMMY1km”(数据)价值([[-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]])

手册中的array value input更多内容。

埃尔戈:

matData [i]需要包含ARRAY[-3000, -3000]或其他列出的有效语法变体而不是[[-3000 -3000 -3000 ...,这对整数数组无效。

Psychopg会自动将 PostgreSQL数组转换为 Python列表。构建INSERT时,需要将列表转换回数组。我引自here

Python lists are converted into PostgreSQL ARRAYs:

>>> cur.mogrify("SELECT %s;", ([10, 20, 30], ))
'SELECT ARRAY[10, 20, 30];'

免责声明:我是PostgreSQL的专家,而不是Python。对于比我更了解Python的人来说,相应地格式化字符串应该很容易。我在网上快速研究了上面的引文。