【问题标题】:Issue for insert using psycopg使用 psycopg 插入的问题
【发布时间】:2011-10-06 23:27:41
【问题描述】:

我正在使用 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 .....

如果有人可以为此提出解决方法,那就太好了。 谢谢!

【问题讨论】:

    标签: python postgresql matlab psycopg2 pytables


    【解决方案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 的人来说,相应地格式化字符串应该很容易。我在网络上的快速研究中找到了上述引用。

    【讨论】:

    • 我在代码中添加了for循环。基本上,INSERT 语句从 matData[i] 变量中获取值。([[3000... 是错误消息中显示的值) matData 列表是通过使用 pyTables 读取 .mat 文件来填充的。
    • @Aditya:“DUMMY1km”.data 的数据类型是什么?
    • @Aditya;那我猜对了,我的回答应该已经对你有所帮助了。我将重点编辑matData[i]
    • 是的,但问题在于格式化 pyTables 返回的数组以适合插入。我仍在研究如何从数组中删除多余的“[”并在值之间插入“,”。
    猜你喜欢
    • 2023-03-31
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多