Chúng ta nên thử hủy trích dẫn thông báo lỗi đó để xem rõ hơn một chút điều gì đang xảy ra ở đây. Chúng tôi có thể làm điều đó tại dấu nhắc 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, tốt hơn nhiều.
Thông thường, Postgres cẩn thận sử dụng ^
nhỏ ký tự để chỉ vào vị trí chính xác trong dòng mà nó bị nhầm lẫn - nhưng ở đây, nó đang trỏ vào giữa nhãn “Dòng 1” mà nó đặt ở phía trước của dòng khiến nó bối rối. Có thể phần cắt và dán của bạn vào Stack Overflow đã thu gọn nhiều khoảng trắng liên tiếp với nhau, điều này có thể xảy ra nếu trình chỉnh sửa hoặc trình duyệt của bạn có tâm trạng bất đồng.
Vì vậy, tôi không thể nói chính xác lỗi xảy ra ở đâu trong dòng, nhưng tôi có một phỏng đoán rất chắc chắn:bằng cách nào đó, dấu ngoặc kép Python mà bạn đang cố gắng bao quanh câu lệnh của mình thực sự được chuyển đến Postgres! Sau vài phút xem qua lời nhắc của Postgres, chỉ cách tôi có thể tìm thấy để nhận được thông báo "lỗi cú pháp" có "LINE" bắt đầu bằng dấu ngoặc kép là thực sự nhập dấu ngoặc kép theo cách thủ công vào SQL, nơi chúng không thuộc về (vì Postgres không hiểu dấu ngoặc kép; đó là Python quy ước):
$ 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""";
^
Vấn đề là lỗi này không thể xảy ra với mã mẫu mà bạn đã hiển thị. Để gặp lỗi này, trên thực tế, bạn phải nhập mã Python như sau:
cur.executemany('"""INSERT INTO ddmension(id,name) ..."""', data)
Có nhiều cách khác để lấy dấu ngoặc kép bên trong chuỗi Python, nhưng đây là cách dễ nhất. Trong mọi trường hợp, thông báo lỗi Postgres của bạn chắc chắn nhất cho thấy dấu ngoặc kép đang nằm bên trong SQL của bạn, vì vậy hãy thử kiểm tra lại mã Python của bạn và chúng tôi sẽ giúp bạn tìm ra cách các dấu ngoặc kép đang cuộn trong chuỗi của bạn!