2016-05-23 8 views
0

私はPostgreSQL DBでクエリを実行するためにGoを使用しています。 DB idのタイプはbigintです。フィールドとプレースホルダの比較 - PostgreSQL

db.Exec("UPDATE tags SET association_count = association_count - 1 WHERE id=?;", id) 

私はこのコードを実行すると、私はこれがid?間タイピングの不一致が原因で発生し伝えることができるものから、SQLエラー

operator does not exist: bigint =? 

を取得します。私は::でキャストしようとしましたが、エラーが発生し、これについて何も見つかりませんでした。面白いことに、id = ?のようなスペースがあると、一般的な構文エラーがスローされます。どのようにキャストするか、これを回避するための考え?

+0

これは型の問題ではありません。問題は、プレースホルダが置き換えられていないか、 'id'変数の値が'? ' –

+0

問題はセミコロンですか? –

+0

@ClodoaldoNeto 'id'変数の値が'? 'であることはどういう意味ですか? Postgresのように、それが見ている 'id'を知りませんか? – cfatt10

答えて

3

Postgresは$ 1、$ 2、任意に指定することができるパラメータのデータ・タイプの対応するリストを使用して、位置によってパラメータを参照して、プレースホルダ

準備された文を作成postgres docsため$#を使用します。パラメータのデータ型が指定されていないか、またはunknownと宣言されている場合、型はパラメータが使用されているコンテキストから推測されます(可能な場合)。ステートメントを実行するときは、EXECUTEステートメントでこれらのパラメーターの実際の値を指定します。詳細については、EXECUTEを参照してください。

ので、ここで

result, err := db.Exec(` 
    UPDATE tags 
    SET association_count = association_count - 1 
    WHERE id=$1;`, id 
) 
を試してみてください

UPDATEようresultが見えるものです: a_horse_with_no_nameが良い点になります。 これは、使用しているクライアントライブラリによって異なります。私はそれがpqと仮定していました。それはgolangのポストグルには人気があるからです。

+2

マニュアルのコメントは手続き型言語の中のステートメント、例えばPL/pgSQLを参照しています。 「クライアント」言語からのプレースホルダ処理は、言語のドライバによって処理されます。 JDBCでは、プレースホルダ_is_ '?'と '$ 1'はそこでは動作しません。この場合、Goのドライバはバックエンドと同じ構文を使用しているようです。しかし、マニュアルの引用は実際にはアプリケーション言語の準備文を参照していません。 –

+0

@a_horse_with_no_nameそれは良い点です。私はOPがpostgresの '$ 1'構文を模倣しているpqを使っていると仮定していました。 – poopoothegorilla

+0

@poopoothegorilla別の小さな点: 'id'の後にカンマが必要です:) – Snowman

関連する問題