Bạn đang cố gắng chuyển tên bảng làm tham số. Bạn có thể thấy điều này ngay lập tức nếu bạn chỉ nhìn vào nhật ký lỗi PostgreSQL.
Tên bảng mà bạn đang cố gắng chuyển qua psycopg2 khi một tham số đang được thoát, tạo ra một truy vấn như:
INSERT INTO E'my_table'(name, url, id, point_geom, poly_geom) VALUES (E'ST_GeomFromText(''POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))'',4326)');'
Đây không phải là những gì bạn dự định và sẽ không hiệu quả; bạn không thể thoát khỏi một tên bảng giống như một nghĩa đen. Bạn phải sử dụng nội suy chuỗi Python thông thường để tạo SQL động, bạn chỉ có thể sử dụng trình giữ chỗ câu lệnh được tham số hóa cho các giá trị chữ thực tế.
params = ('POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))',4326)
escaped_name = name.replace('"",'""')
curs.execute('INSERT INTO "%s"(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%%s,%%s));' % escaped_name, params)
Xem cách tôi đã nội suy trực tiếp tên để tạo chuỗi truy vấn:
INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));
(%%
được chuyển đổi thành %
đơn giản bằng% thay thế). Sau đó, tôi đang sử dụng truy vấn đó với chuỗi xác định POLYGON
và đối số khác cho ST_GeomFromText
dưới dạng tham số truy vấn.
Tôi chưa kiểm tra điều này, nhưng nó sẽ cung cấp cho bạn ý tưởng đúng và giúp giải thích điều gì sai.
HÃY CẨN THẬN HẾT MÌNH khi thực hiện nội suy chuỗi như thế này, đó là một cách dễ dàng để chèn SQL. Tôi đã thực hiện trích dẫn rất thô sơ trong đoạn mã được hiển thị ở trên, nhưng tôi muốn sử dụng một hàm trích dẫn mã định danh thích hợp nếu thư viện khách hàng của bạn cung cấp một hàm.