Postgres / psycopg2 - вставка массива строк - PullRequest
11 голосов
/ 28 июля 2011

Я использую 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 ]

20 голосов
/ 28 июля 2011

Вы должны позволить psycopg выполнять привязку параметров для вас: не пытайтесь сами их цитировать.

Psycopg автоматически преобразует список строк Python в массив postgres. Чек http://initd.org/psycopg/docs/usage.html

3 голосов
/ 18 марта 2015
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))
0 голосов
/ 28 июля 2011

Если вы хотите вставить массив в базу данных postgreSQL через SQL, вы делаете это так:

INSERT INTO tablename VALUES ('{value1,value2,value3}');

ВНИМАНИЕ: Вам нужны одинарные кавычки, чтобы окружить фигурные скобки! Таким образом, на самом деле вы передаете String / 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, написав вспомогательную функцию, либо используете библиотеку, которая делает это за вас.

0 голосов
/ 28 июля 2011

Если вы собираетесь сбросить все метаданные в виде строки в таблицу, вы можете просто сделать:

cur.execute("insert into meta values (%s);", (str(metadata),))
...