sql >> Databasteknik >  >> NoSQL >> MongoDB

psycopg2 misslyckas vid exekvering av många uttalanden med syntaxfel

Vi bör försöka ta bort det felmeddelandet för att se lite tydligare vad som händer här. Vi kan göra det vid Python-prompten:

>>> 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, mycket bättre.

Normalt sett är Postgres noga med att använda den lilla ^ tecken för att peka på den exakta plats på raden där den blev förvirrad – men här pekar den på mitten av etiketten "Linje 1" som den sätter fram av linjen som förvirrade det. Förmodligen kollapsade ditt klipp-och-klistra i Stack Overflow flera på varandra följande utrymmen, vilket kan hända om din redigerare eller webbläsare var på ett obehagligt humör.

Så jag kan inte säga exakt var i raden felet uppstod, men jag har en mycket stark gissning:på något sätt skickas faktiskt Python-trippelcitaten som du försöker omge ditt uttalande med till Postgres! Efter flera minuters lek vid Postgres-prompten, den enda sättet jag kan hitta för att få ett "syntaxfel"-meddelande vars "LINE" börjar med trippelcitattecken är att faktiskt skriva in trippelcitattecken manuellt i SQL, där de inte hör hemma (eftersom Postgres inte förstår trippelcitattecken; det är en Python konvention):

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

Problemet är att detta fel är omöjligt med exempelkoden som du har visat. För att få det här felet hade du faktiskt behövt skriva Python-kod så här:

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

Det finns andra sätt att få trippelcitattecken inuti en Python-sträng, men det här är det enklaste. I vilket fall som helst visar ditt Postgres-felmeddelande med största säkerhet att tredubbla citattecken kommer in i din SQL, så försök kontrollera din Python-kod igen, så hjälper vi dig att ta reda på hur bokstavliga citattecken hamnar i dina strängar!




  1. Hur räknar man distinkta datumobjekt i ett tidsstämpelfält i Mongoose/NodeJS?

  2. Hur man sparar endast datumdel med mongoose, inte i ISODate-format

  3. MongoDB:Bulk infoga (Bulk.insert) vs insert multiple (insert([...]))

  4. Meteor.js mongodb version