web-dev-qa-db-ja.com

PostgreSQLの入力の最後の構文エラー

MySQLとPostgreSQLの両方で次のSQLステートメントを使用しましたが、PostgreSQLでは失敗します

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

このエラーで:

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

どうしたの? PostgreSQLのエラーメッセージは非常にわかりにくいです。

13
user1243746

言語/環境についての詳細は提供していませんが、とにかくワイルドな推測を試みます。

MySQLの準備されたステートメントは、パラメータープレースホルダーとして?をネイティブで使用しますが、PostgreSQLは$1$2などを使用します。?$1で置き換えて、機能するかどうか確認してください。

WHERE address = $1

PostgreSQLのエラーメッセージは非常にわかりにくいです。

一般的に、Postgresのエラーメッセージは競合する製品(ahem、MySQL、および特に Oracle)よりも優れていることがわかりましたが、この例では、正常性を超えてパーサーを混乱させています。 :)

39
intgr

Goを使用していますか?

試してください:

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

私たちが使用しているクエリのgolangでは

  • MySQLは?バリアント
  • PostgreSQLは$ 1、$ 2などの列挙型bindvar構文を使用します
  • SQLiteは両方を受け入れますか?および$ 1構文
  • Oracleは:name構文を使用します
0
refrazul

私の場合は、データベースとの対話を担当するプログラムがクエリの複数行をすべて1つの巨大な行として読み取る-行コメントを使用したことが原因でした。これは、行コメントにより残りのクエリが破損したことを意味します。修正は、代わりに/ *ブロックコメント* /を使用することでした。

0
calamari