2012-10-29 21 views
9

Tôi đã sử dụng các câu lệnh SQL tiếp theo trong cả MySQL và PostgreSQL, nhưng nó bị lỗi trong PostgreSQLCú pháp lỗi ở cuối đầu vào trong PostgreSQL

db.Query(`SELECT COUNT(*) as N FROM email WHERE address = ?`, email) 

với lỗi này:

pq: F:"scan.l" M:"syntax error at end of input" S:"ERROR" C:"42601" P:"50" R:"scanner_yyerror" L:"993" 

vấn đề là gì ? Các thông báo lỗi trong PostgreSQL rất khó hiểu.

+2

Bạn đang mã hóa ngôn ngữ nào? Tôi có nghĩa là ngôn ngữ của khách hàng, không phải là SQL. –

+1

Bạn đang sử dụng ứng dụng cơ sở dữ liệu nào? Đó là lỗi khó hiểu là nhiều hơn để làm với khách hàng cơ sở dữ liệu hơn so với máy chủ cơ sở dữ liệu. Nếu tôi chuẩn bị tuyên bố đó thì tốt, vì vậy vấn đề rất có thể xảy ra với ngôn ngữ lập trình hoặc bộ điều hợp cơ sở dữ liệu của bạn. Hãy thử nó trong 'psql'. 'PREPARE q CHỌN SELECT COUNT (*) là N TỪ email WHERE address = $ 1;' sau đó 'EXECUTE q;'. '$ 1' là cú pháp giữ chỗ cho' PREPARE', nhưng ngôn ngữ lập trình của bạn có thể sử dụng '?'; nếu không thì không có sự khác biệt. –

Trả lời

25

Bạn chưa cung cấp bất kỳ thông tin chi tiết về ngôn ngữ/môi trường, nhưng tôi sẽ cố gắng đoán hoang dã anyway: chuẩn bị phát biểu

MySQL của natively sử dụng ? như tham số placeholder , nhưng PostgreSQL sử dụng $1, $2 vv Hãy thử thay thế ? với $1 và xem nếu nó hoạt động:

WHERE address = $1 

The error messages in PostgreSQL are very cryptic.

Nói chung, thông báo lỗi Postgres rất rõ ràng, nhưng trong trường hợp này, bạn đã quản lý nhầm lẫn giữa trình phân tích cú pháp ngoài sự tỉnh táo. :)

+5

Lưu ý rằng điều này phụ thuộc vào ngôn ngữ lập trình và trình điều khiển truy cập cơ sở dữ liệu được sử dụng. Trong JDBC, ví dụ, giữ chỗ luôn luôn là '?'. Ý tưởng về các trình giữ chỗ khác nhau dựa trên trình điều khiển DB khá là kinh khủng. –

+2

@CraigRinger, nhưng buộc mỗi trình điều khiển phải hiểu một trình giữ chỗ cụ thể (nói, '?') Buộc phía máy khách thực hiện trình phân tích cú pháp SQL đầy đủ khớp với công cụ DB mục tiêu. Hơn nữa, '$ N' có khả năng cho phép bạn chỉ định một giá trị cho một số trình giữ chỗ trong khi'? 'Thì không. – kostix

+2

@CraigRinger Tìm các cá thể của '? 'Thật dễ dàng. Nhưng sẽ khó khăn hơn nếu bạn xem xét rằng '?' Là một ký tự hợp lệ trong chuỗi - và không nên thay đổi ở đó! Cùng với tất cả các quy tắc thoát khác nhau có thể, phụ thuộc vào cài đặt phía máy chủ và các phiên bản Postgres, cùng với một số trường hợp phân tích cú pháp khá phức tạp liên quan đến cú pháp '$ foo $? $ Foo $' của PostgreSQL. Nó bị * VERY * khó chịu. – intgr

7

Bạn đang sử dụng Go right?

thử:

db.Query(`SELECT COUNT(*) as N FROM email WHERE address = $1`, email) 
+0

vâng, bạn nói đúng, đó là Go –

+0

Điều này cũng phù hợp với tôi. Cách điền vào nơi các tài liệu bị thiếu. – nbsp

-1

Hãy thử với @ Symbol Làm việc cho tôi.

khi sử dụng ? Symbol:

nó nói "ERROR: 42.601: lỗi cú pháp ở cuối đầu vào"

khi dùng $ 1:

Nó nói "ERROR: 42P02: không có tham số $ 1"

Các vấn đề liên quan