Měli bychom zkusit zrušit citaci této chybové zprávy, abychom viděli trochu jasněji, co se zde děje. Můžeme to udělat na příkazovém řádku Pythonu:
>>> 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
^
Aha, mnohem lepší.
Normálně Postgres opatrně používá malý ^
znak, aby ukazoval na přesné místo v řádku, kde došlo k záměně – ale zde ukazuje na střed štítku „Řádek 1“, který vkládá přední linie, která to mátla. Pravděpodobně vaše vyjmutí a vložení do Stack Overflow sbalilo několik po sobě jdoucích mezer dohromady, což se může stát, pokud měl váš editor nebo prohlížeč nepříjemnou náladu.
Nemohu tedy přesně říci, kde v řádku došlo k chybě, ale mám velmi silný odhad:nějak se do Postgresu ve skutečnosti dostávají trojité uvozovky v Pythonu, kterými se snažíte obklopit své prohlášení! Po několika minutách hraní na výzvu Postgres, jediné způsob, jak mohu najít zprávu o „chybě syntaxe“, jejíž „LINE“ začíná trojitými uvozovkami, je ve skutečnosti napsat trojité uvozovky ručně do SQL, kam nepatří (protože Postgres nerozumí trojitým uvozovkám; je to Python konvence):
$ 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""";
^
Problém je, že tato chyba je nemožná s ukázkovým kódem, který jste zobrazili. Abyste dostali tuto chybu, museli byste ve skutečnosti napsat kód Pythonu takto:
cur.executemany('"""INSERT INTO ddmension(id,name) ..."""', data)
Existují i jiné způsoby, jak získat trojité uvozovky uvnitř řetězce Pythonu, ale toto je nejjednodušší. V každém případě vaše chybová zpráva Postgres zcela jistě ukazuje, že se do vašeho SQL dostávají trojité uvozovky, takže zkuste znovu zkontrolovat váš kód v Pythonu a my vám pomůžeme zjistit, jak se ve vašich řetězcích vinou doslovné uvozovky!