psycopg2 mislukt bij het uitvoeren van veel instructies met syntaxisfouten

Ik heb gegevens afkomstig van mongodb die eruit ziet

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

wanneer ik het volgende noem

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

het faalt te zeggen

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'  

Kan iemand me begeleiden wat het probleem zou kunnen zijn? Ik volg de deze tutorial

Dank je

0
het feit dat er een typfout in de tabelnaam voorkomt, betekent dat u de exacte code en/of uitvoer die u krijgt niet plaatst.
toegevoegd de auteur jfs, de bron
Wat cur.mogrify (args_to_executemany) laat zien?
toegevoegd de auteur jfs, de bron

1 antwoord

We moeten proberen om die foutmelding niet te citeren om een ​​beetje duidelijker te zien wat hier gebeurt. We kunnen dat doen op de Python-prompt:

>>> 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, veel beter.

Normaal gesproken is Postgres voorzichtig om het kleine ^ -teken te gebruiken om naar de exacte plaats in de rij te verwijzen waar het in de war raakte - maar hier wijst het naar het midden van het label "Lijn 1" dat het zet vooraan van de regel die het verwarde. Waarschijnlijk heeft je knip-en-plak in Stack Overflow verschillende opeenvolgende ruimtes tegelijk samengevouwen, wat kan gebeuren als je editor of browser zich in een onaangename bui bevond.

Dus ik kan niet precies vertellen waar in de rij de fout is opgetreden, maar ik heb een sterke gok: op de een of andere manier worden de Python-drievoudige aanhalingstekens waarmee je je statement probeert te omringen, echt doorgegeven aan Postgres! Na enkele minuten spelen op de Postgres-prompt, kan de enige manier die ik kan vinden om een ​​"syntaxisfout" -bericht te krijgen waarvan de "LINE" begint met drievoudige aanhalingstekens, eigenlijk de drievoudige aanhalingstekens handmatig in de SQL, waar ze niet thuishoren (omdat Postgres geen driedubbele aanhalingstekens begrijpt, het is een Python-afspraak):

$ 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""";
        ^

Het probleem is dat deze fout niet mogelijk is met de voorbeeldcode die u hebt weergegeven. Om deze fout te krijgen, zou je in feite Python-code als volgt moeten typen:

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

Er zijn andere manieren om driekwartcitaten binnen een Python-snaar te krijgen, maar dit is het gemakkelijkst. In ieder geval is je Postgres-foutmelding zeker te zien dat driedubbele aanhalingstekens binnen je SQL komen, dus probeer je Python-code opnieuw te controleren, en we zullen je helpen erachter te komen hoe letterlijke aanhalingstekens in je snaren opraken!

0
toegevoegd