Проблема для вставки с использованием psycopg
0 Aditya [2011-10-07 02:27:00]
Я читаю данные из файла .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 .....
Было бы здорово, если бы кто-нибудь мог предложить обходное решение для этого. Спасибо!
python postgresql matlab psycopg2 pytables
1 ответ
1 Erwin Brandstetter [2011-10-07 03:01:00]
Оператор INSERT
имеет недопустимый синтаксис. Что-то не так внутри цикла, о котором вы говорите.
Вы должны включить цикл 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"
или для 2-мерного массива (выглядит так же, как в сообщении об ошибке msg.):
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 в список Python. При создании INSERT вам нужно преобразовать список обратно в массив. Я цитирую из здесь:
Python lists are converted into PostgreSQL ARRAYs: >>> cur.mogrify("SELECT %s;", ([10, 20, 30], )) 'SELECT ARRAY[10, 20, 30];'
Отказ от ответственности: я эксперт в PostgreSQL, не столько с Python. Для кого-то, кто знает Python лучше меня, нужно легко форматировать строку. Я нашел приведенную выше цитату в быстром исследовании в Интернете.