Вопрос для вставки с использованием psycopg - PullRequest
0 голосов
/ 07 октября 2011

Я читаю данные из файла .mat с помощью модуля Pytables.После прочтения данных, я хочу вставить эти данные в базу данных с помощью 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 Ответ

1 голос
/ 07 октября 2011

Оператор INSERT имеет неверный синтаксис.Что-то не так в цикле for, о котором вы упомянули.
Вы должны включить в вопрос цикл for.

ВСТАВИТЬ INTO "DUMMY1km" (data) 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]])

Подробнее о вводе значения массива в руководстве.

Ergo:

matData [i]должен содержать ARRAY[-3000, -3000] или один из перечисленных вариантов допустимого синтаксиса вместо [[-3000 -3000 -3000 ..., который недопустим для целочисленного массива.

Psychopg автоматически преобразует массив PostgreSQL вa Python list . При создании INSERT вам необходимо преобразовать список обратно в массив. Я цитирую here :

Python lists are converted into PostgreSQL ARRAYs:

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

Отказ от ответственности: я эксперт по PostgreSQL, а не по Python.Для кого-то, кто знает Python лучше меня, должно быть легко отформатировать строку соответствующим образом.Я нашел приведенную выше цитату в быстром исследовании в Интернете.

...