psycopg2, sözdizimi hatası olan birçok ifadeyi yürütmede başarısız oluyor

Görünüşe göre mongodb 'dan gelen veriler var

data = 
(
 {
   u'name': 'A',
   u'primary_key': 1
 },
 {
   u'name': 'B',
   u'primary_key': 2
 },
 {
   u'name': 'C',
   u'primary_key': 3
 }
)

aşağıdakileri aradığımda

cur = conn.cursor()
cur.executemany("""INSERT INTO ddmension(id,name) VALUES (%(primary_key)s, %(name)s)""", data) 

söyleyerek başarısız

ProgrammingError: 'syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E\'A\')""""\nLINE 1: """INSERT INTO dimension (id, name) VALUES (1, E\'A\n ^\n'  

Birisi bana sorunun ne olabileceğini söyleyebilir mi? bu öğreticiyi takip ediyorum

teşekkür ederim

0
Tablo adında bir yazım hatası olduğu gerçeği, aldığınız kodu ve/veya çıktının tamamını kaydetmediğiniz anlamına gelir.
katma yazar jfs, kaynak
cur.mogrify (args_to_executemany) ne gösterir?
katma yazar jfs, kaynak

1 cevap

Burada neler olup bittiğini biraz daha net görmek için bu hata mesajından alıntı yapmayı denemeliyiz. Bunu Python isteminde yapabiliriz:

>>> message = 'syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E\'A\')""""\nLINE 1: """INSERT INTO dimension (id, name) VALUES (1, E\'A\n ^\n'
>>> print message
syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E'A')""""
LINE 1: """INSERT INTO dimension (id, name) VALUES (1, E'A
 ^

Ahh, çok daha iyi.

Normal olarak, Postgres, küçük ^ karakterini, karıştığı satırdaki tam yeri işaret etmek için kullanmaya dikkat eder - ancak burada, “Satır 1” etiketinin ortasına Kafasını karıştıran çizginin önüne konur. Muhtemelen Yığın Taşması'na kesip yapıştırmanız birkaç ardışık boşluğu birlikte daralttı; bu, editörünüz veya tarayıcınız aynı fikirde olmuyorsa gerçekleşebilir.

Bu nedenle, hatanın tam olarak nerede gerçekleştiğini tam olarak söyleyemem, ancak çok güçlü bir tahminim var: bir şekilde, Python ifadenizi çevrelemeye çalıştığınız üçlü alıntılar aslında Postgres'e giriyor! Postgres isteminde birkaç dakika uğradıktan sonra, “LINE” üçlü tırnak işaretleriyle başlayan bir “sözdizimi hatası” mesajı bulabilmemin sadece yolu, üçlü tırnakları manuel olarak yazmanın yoludur. Ait olmadıkları SQL (Postgres üçlü alıntılamayı anlamadığından; bu bir Python sözleşmesidir):

$ psql postgres 
Null display is "NULL".
psql (8.4.8)
Type "help" for help.

postgres=# """SELECT 1""";
ERROR:  syntax error at or near """"SELECT 1""""
LINE 1: """SELECT 1""";
        ^

Sorun, bu hatanın, görüntülediğiniz örnek kodda mümkün olmamasıdır. Bu hatayı almak için, aslında şöyle Python kodunu yazmanız gerekirdi:

cur.executemany('"""INSERT INTO ddmension(id,name) ..."""', data) 

Python dizesinin içinde üçlü tırnaklar almanın başka yolları da var, ama bu en kolay olanı. Her durumda, Postgres hata mesajınız kesinlikle üçlü alıntıların SQL'inizin içine girdiğini gösteriyor, bu nedenle Python kodunuzu tekrar kontrol etmeyi deneyin ve hazır sözcük işaretlerinin dizelerinizde nasıl dolaştığını bulmanıza yardımcı olacağız!

0
katma