MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

psycopg2 non riesce a eseguire molte istruzioni con errore di sintassi

Dovremmo provare a togliere le virgolette a quel messaggio di errore per vedere un po' più chiaramente cosa sta succedendo qui. Possiamo farlo al prompt di Python:

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

Ah, molto meglio.

Normalmente Postgres fa attenzione a usare il piccolo ^ carattere per puntare nel punto esatto della riga in cui è stato confuso, ma qui punta al centro dell'etichetta "Linea 1" che inserisce davanti della linea che lo confondeva. Probabilmente il tuo taglia e incolla in Stack Overflow ha compresso diversi spazi consecutivi, cosa che può accadere se il tuo editor o browser fosse di umore sgradevole.

Quindi non posso dire esattamente dove si è verificato l'errore nella riga, ma ho un'ipotesi molto forte:in qualche modo, le triple virgolette Python con cui stai cercando di circondare la tua affermazione vengono effettivamente trasmesse a Postgres! Dopo diversi minuti di gioco al prompt di Postgres, il solo il modo in cui posso trovare per ottenere un messaggio di "errore di sintassi" la cui "LINEA" inizia con virgolette triple è effettivamente digitare manualmente le virgolette triple nell'SQL, dove non appartengono (poiché Postgres non comprende le virgolette triple; è un Python convenzione):

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

Il problema è che questo errore è impossibile con il codice di esempio visualizzato. Per ottenere questo errore, avresti dovuto digitare il codice Python in questo modo:

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

Esistono altri modi per ottenere virgolette triple all'interno di una stringa Python, ma questo è il più semplice. In ogni caso, il tuo messaggio di errore Postgres mostra sicuramente che le virgolette triple stanno entrando nel tuo SQL, quindi prova a controllare di nuovo il tuo codice Python e ti aiuteremo a capire come le virgolette letterali finiscono nelle tue stringhe!