2011-07-28 27 views
6

私はPostgres 9とPython 2.7.2をpsycopg2と共に使用していて、適切にエスケープされた引用符で文字列値の配列を挿入しようとしています。サンプル:例外をスローPostgres/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を使用して試してみたが、まだ正しい組み合わせを発見していません。アイデア?

+0

[\ 'One'、\ 'Two \'、\ 'Three \'] "'にはどのようなエラーがありますか? – agf

答えて

16

あなたはpsycopgはあなたのための結合パラメータをやらせるために持っていることは:それらを引用しようとしないでくださいあなた自身。

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

+0

ああ、ちょっとした書式の変更がありませんでした。 cur.execute( "メタ値%sに挿入"、メタデータ)を使用して私の仕事をしました。どうもありがとうございました。 – Ian

0

あなたがテーブルに文字列として全体のメタデータをダンプしようとしている場合は、あなただけ行うことができます。

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

を確認してくださいあなたはSQL経由でpostgreSQLのDBに配列を挿入したい場合は、あなたがこのようにそれを実行します。

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

注意:あなたは、中括弧を囲むように単一引用符が必要です!

'{'Name': 'Guest', 'Details': "['One', 'Two', 'Three']"}' 

しかし、PostgreSQLには、何かを期待:だから、実際に私はPythonのパーサにコードを入力した場合、私はこのような何かを得るDB

に文字列の特殊な「アレイ」文法の/ varchar型を渡していますこのように:

'{"Name","Guest","Details",{"One","Two","Three"}}' 

配列の手動チェック:http://www.postgresql.org/docs/9.0/static/arrays.html

をですから、PostgreSQLの「アレイ・文法に従った文字列をフォーマットのいずれか"ヘルパー関数を書くか、それを行うライブラリを使用します。

2
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))