Powinniśmy spróbować usunąć cytowanie tego komunikatu o błędzie, aby nieco jaśniej zobaczyć, co się tutaj dzieje. Możemy to zrobić po znaku zachęty Pythona:
>>> 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
^
Ach, znacznie lepiej.
Zwykle Postgres ostrożnie używa małego ^
znak wskazujący dokładnie to miejsce w linii, w którym się pomylił — ale tutaj wskazuje na środek etykiety „Linia 1”, którą umieszcza z przodu linii, która go myliła. Prawdopodobnie twoje kopiowanie i wklejanie do Stack Overflow zwinęło kilka kolejnych spacji, co może się zdarzyć, jeśli twój edytor lub przeglądarka były w nieprzyjemnym nastroju.
Nie mogę więc dokładnie powiedzieć, gdzie w wierszu wystąpił błąd, ale mam bardzo mocne przypuszczenie:w jakiś sposób potrójne cudzysłowy Pythona, którymi próbujesz otoczyć swoje oświadczenie, są w rzeczywistości przekazywane do Postgresa! Po kilku minutach zabawy przy znaku zachęty Postgresa jedyne sposób, w jaki mogę znaleźć komunikat „błędu składni”, którego „LINE” zaczyna się od potrójnych cudzysłowów, polega na ręcznym wpisaniu potrójnych cudzysłowów do SQL, gdzie nie należą (ponieważ Postgres nie rozumie potrójnego cudzysłowu; jest to Python konwencja):
$ 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""";
^
Problem polega na tym, że ten błąd jest niemożliwy z przykładowym kodem, który wyświetliłeś. Aby uzyskać ten błąd, musiałbyś w rzeczywistości wpisać kod Pythona w następujący sposób:
cur.executemany('"""INSERT INTO ddmension(id,name) ..."""', data)
Istnieją inne sposoby na uzyskanie potrójnego cudzysłowu w łańcuchu Pythona, ale ten jest najłatwiejszy. W każdym razie, twój komunikat o błędzie Postgresa z pewnością pokazuje, że potrójne cudzysłowy dostają się do twojego SQL, więc spróbuj ponownie sprawdzić swój kod Pythona, a my pomożemy ci dowiedzieć się, jak dosłowne cudzysłowy trafiają do twoich łańcuchów!