2012-10-29 21 views
9

Użyłem następnego SQL zarówno MySQL i PostgreSQL, ale nie jest on w PostgreSQLBłąd składni w końcu wejście w PostgreSQL

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

z tego błędu:

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

czym problem ? Komunikaty o błędach w PostgreSQL są bardzo zagadkowe.

+2

W jakim języku kodujesz? Mam na myśli język klienta, a nie SQL. –

+1

Z jakiego klienta bazy danych korzystasz? Ten tajemniczy błąd jest dużo bardziej związany z klientem bazy danych niż z serwerem bazy danych. Jeśli przygotuję to stwierdzenie, to jest w porządku, więc problem jest najprawdopodobniej związany z językiem programowania lub adapterem bazy danych. Wypróbuj w 'psql'. 'PREPARE q AS SELECT COUNT (*) jako N Z emaila WHERE address = $ 1;' then 'EXECUTE q;'. '$ 1' jest składnią zastępczą dla' PREPARE', ale twój język programowania prawdopodobnie używa '?'; inaczej nie ma różnicy. –

Odpowiedz

25

nie dostarczyły żadnych szczegółów na temat języka/środowiska, ale postaram dziką przypuszczenie i tak: Przygotowane sprawozdania

MySQL natywnie używać ? jako parametr zastępczy , ale PostgreSQL używa $1, $2 itd. Spróbuj wymienić ? z $1 i sprawdzić, czy to działa:

WHERE address = $1 

The error messages in PostgreSQL are very cryptic.

Ogólnie, komunikaty o błędach PostgreSa są bardzo jasne, ale w tym przypadku udało ci się pomylić parser poza zdrowiem. :)

+5

Należy pamiętać, że jest to zależne od używanego języka programowania i sterownika dostępu do bazy danych. Na przykład w JDBC symbolami zastępczymi są zawsze '?'. Pomysł na posiadanie różnych symboli zastępczych w oparciu o sterownik DB jest dość przerażający. –

+2

@CraigRinger, ale zmuszenie każdego sterownika do zrozumienia konkretnego symbolu zastępczego (np. '?') Zmusza stronę klienta do implementacji pełnego parsera SQL pasującego do docelowego silnika bazy danych. Co więcej, '$ N' potencjalnie pozwala ci określić jedną wartość dla kilku symboli zastępczych, podczas gdy'? 'Nie. – kostix

+2

@CraigRinger Znajdowanie wystąpień '?' Jest łatwe. Ale jest o wiele trudniej, jeśli uważasz, że '?' Jest prawidłową postacią w ciągu znaków - i nie powinno tam być zmieniane! W połączeniu ze wszystkimi możliwymi różnymi regułami ucieczki, które zależą od ustawień po stronie serwera i wersji PostgreSQL, a także od dość skomplikowanych przypadków analizowania składni PostgreSQL '$ foo $? $ Foo $'. To staje się * BARDZO * nieprzyjemne. – intgr

7

Używasz Idź w prawo?

try:

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

tak, masz rację, to Go –

+0

To działało również dla mnie. Sposób wypełnienia tam, gdzie brakowało dokumentów. – nbsp

-1

Spróbuj z @ Symbolem To działa dla mnie.

podczas korzystania z ? Symbol:

mówi "BŁĄD: 42601: błąd składni w końcu wejście"

gdy Korzystanie $ 1:

mówi "BŁĄD: 42P02: nie ma parametr $ 1"

Powiązane problemy