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を使用してバックスラッシュと一緒にエスケープしようとしましたが、正しい組み合わせはまだ見つかりませんでした。アイデア?
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))
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の「配列文法」に従って文字列をフォーマットするか、それを実行するライブラリを使用します。