Postgres / psycopg2-вставка массива строк
Я использую Postgres 9 и Python 2.7.2 вместе с psycopg2 и пытаюсь вставить массив строковых значений с правильно экранированными кавычками. Пример:
metadata = {"Name": "Guest", "Details": "['One', 'Two', 'Three']"}
cur.execute("insert into meta values ('%s');" % metadata)
, который бросает исключение:
psycopg2.ProgrammingError: syntax error at or near "One"
LINE 1: "Details": "['One...
^
Я также попытался использовать Postgres' E, чтобы убежать вместе с обратными косыми чертами,но еще не нашел правильную комбинацию. Идеи?
4 ответов
вы должны позволить psycopg сделать параметры привязки для вас: не пытайтесь цитировать их самостоятельно.
Psycopg автоматически преобразует список строк python в массив postgres. Проверить http://initd.org/psycopg/docs/usage.html
def lst2pgarr(alist):
return '{' + ','.join(alist) + '}'
pyarray = ['pippo', 'minni', 1, 2]
conn = psycopg2.connection ( HERE PUT YOUR CONNECTION STRING )
c = conn.cursor()
c.execute('select ... where pgarray_attr = %r' % (lst2pgarr(pyarray))
c.execute('insert into tab(pgarray_attr) values (%r)' % (lst2pgarr(pyarray))
Если вы собираетесь сбросить все метаданные в виде строки в таблицу, вы можете просто сделать:
cur.execute("insert into meta values (%s);", (str(metadata),))
когда вы хотите вставить массив в БД postgreSQL через SQL, вы делаете это так:
INSERT INTO tablename VALUES ('{value1,value2,value3}');
внимание: вам нужны одинарные кавычки, чтобы окружить фигурными скобками! Так что на самом деле вы передаете строку/Varchar специальной грамматики "массива" в DB
Если я введу ваш код в парсер python, я получу что-то вроде этого:
'{'Name': 'Guest', 'Details': "['One', 'Two', 'Three']"}'
но PostgreSQL ожидает чего-то подобного:
'{"Name","Guest","Details",{"One","Two","Three"}}'
проверьте руководство по массивам: http://www.postgresql.org/docs/9.0/static/arrays.html
таким образом, либо вы форматируете строку в соответствии с PostgreSQL "array-grammar", написав вспомогательную функцию, либо используете библиотеку, которая делает это за вас.