web-dev-qa-db-ja.com

Postgres / psycopg2-文字列の配列を挿入しています

Postgres9と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を使用してバックスラッシュと一緒にエスケープしようとしましたが、正しい組み合わせはまだ見つかりませんでした。アイデア?

16
Ian

Psycopgにパラメータのバインドを行わせる必要があります。自分で引用しようとしないでください。

Psycopgは自動的にpython文字列のリストをpostgres配列に変換します。チェック http://initd.org/psycopg/docs/usage.html

25
piro
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))
2
LittleEaster

SQLを介してpostgreSQLDBに配列を挿入する場合は、次のようにします。

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
das_weezul