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", написав вспомогательную функцию, либо используете библиотеку, которая делает это за вас.