2011-07-28 11 views
6

Postdres 9 ve Python 2.7.2 psycopg2 ile birlikte kullanıyorum ve düzgün bir şekilde kaçtılan tırnak işaretleri içeren bir dizi dize değeri eklemeye çalışıyorum. Örnek: istisna atarPostgres/psycopg2 - Dizelerin dizisi ekleme

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... 
        ^

Ben de ters eğik birlikte kaçmaya PostgreS' E kullanarak denedim ama henüz doğru kombinasyonunu bulamadı. Fikirler? Eğer tabloya bir dize olarak bütün meta dökümü yapacaksanız

+0

"" [\ 'One \', \ 'Two \', \ 'Three \'] "'? – agf

cevap

16

Sen psycopg parametreleri sizin için bağlayıcı yapmak izin vermek zorunda: onlardan alıntı kalkmayın kendin.

Psycopg otomatik olarak bir python dizesi listesini bir postgre dizisine dönüştürür. Eğer SQL üzerinden bir postgreSQL veritabanına bir dizi eklemek istediğinizde http://initd.org/psycopg/docs/usage.html

+0

Ah Küçük biçim değişikliğini kaçırdım. Cur.execute ("% s meta değerlerine ekle", meta veriler) kullanmak benim için çalıştı. Çok teşekkür ederim. – Ian

0

, tıpkı senin yapabilirsiniz:

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

Eğer böyle yapmak Kontrol:

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

DİKKAT: Sen küme parantezi surround tek tırnak gerek!

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

Ama PostgreSQL şey bekler: Yani aslında ben bir piton ayrıştırıcı içine kod girerseniz

Böyle bir şey olsun/varchar özel bir "Dizi" teriminin gramer DB için bir dize geçirerek böyle:

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

kontrol edin Diziler manuel: Yani ya http://www.postgresql.org/docs/9.0/static/arrays.html

PostgreSQL "dizi-gramer göre dize biçimlendirmek "Bir yardımcı fonksiyon yazarak ya da sizin için bir kütüphane kullanıyorsunuz.

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