MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

psycopg2 échoue lors de l'exécution de plusieurs instructions avec une erreur de syntaxe

Nous devrions essayer de ne pas citer ce message d'erreur pour voir un peu plus clairement ce qui se passe ici. Nous pouvons le faire à l'invite 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
 ^

Ahh, beaucoup mieux.

Normalement, Postgres prend soin d'utiliser le petit ^ caractère pour pointer à l'endroit exact de la ligne où il s'est confondu - mais ici, il pointe au milieu de l'étiquette "Ligne 1" qu'il met en devant de la ligne qui l'a confondu. Votre copier-coller dans Stack Overflow a probablement réduit plusieurs espaces consécutifs ensemble, ce qui peut arriver si votre éditeur ou votre navigateur était de mauvaise humeur.

Je ne peux donc pas dire exactement où l'erreur s'est produite dans la ligne, mais j'ai une très forte supposition:d'une manière ou d'une autre, les triples guillemets Python avec lesquels vous essayez d'entourer votre déclaration sont en fait transmis à Postgres! Après plusieurs minutes de jeu à l'invite Postgres, le seulement façon que je peux trouver pour obtenir un message "d'erreur de syntaxe" dont "LINE" commence par des guillemets triples est de taper manuellement les guillemets triples dans le SQL, où ils n'appartiennent pas (puisque Postgres ne comprend pas les triples guillemets; c'est un Python convention):

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

Le problème est que cette erreur est impossible avec l'exemple de code que vous avez affiché. Pour obtenir cette erreur, vous auriez dû en fait taper du code Python comme ceci :

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

Il existe d'autres moyens d'obtenir des guillemets triples à l'intérieur d'une chaîne Python, mais c'est le plus simple. Dans tous les cas, votre message d'erreur Postgres montre très certainement que des guillemets triples pénètrent dans votre SQL, alors essayez de vérifier à nouveau votre code Python, et nous vous aiderons à comprendre comment les guillemets littéraux se retrouvent dans vos chaînes !