2017-07-19 12 views
0

私は(MySQLを使用して)このようなクエリの何かを実行したい:Golang複数の引数を使用して、データベース/ sql.DB.QueryRow

select * from user where id = 5 

例1.これはerr = sql.ErrNoRowsを返します。

err := db.QueryRow("select * from user where ? = ?", f, v).Scan(&user.Id, etc...) 

例2.上記は動作しませんので、私はそれをしかし働くこのように、やっていることは右に感じることはありません。

err := db.QueryRow("select * from user where "+f+" = ?", v).Scan(&user.Id, etc...) 

何Exで間違っています。 1?例2はこれを受け入れる方法ですか?

コメント内のリンクからEDIT

私はそれを第三の方法を行うことができます。

例3:

q := fmt.Sprintf("select * from user where %s = ?", f) 
err := db.QueryRow(q, v).Scan(&user.Id, etc...) 
+0

をあなたの質問は何ですか? – Adrian

+0

[Golang ORDER BY issue with MySql]の関連する/可能な複製(https://stackoverflow.com/questions/30867337/golang-order-by-issue-with-mysql/30867686#30867686)。 – icza

+1

「どこ? =? 'の動作は、データベースドライバとそれぞれの'? 'が表すものによって異なります。私がよく知っている(Postgres、MySQL、SQLite)のDBでは、カラム名ではなく、値に対してのみ変数置換を使うことができます。これは 'f'があなたのカラム名であることを意味し、2回目の試行(そして同等の3番目の)は"正しい "だけでなく、唯一のオプションです。 – Flimzy

答えて

1

SQLクエリに直接列名を提供する必要があります。 '?' signは、sql文字列の後に指定する値のプレースホルダです。 あなたのEx3。正しいですが、それはSQLインジェクション攻撃のために開かれているため、良い解決策ではありません。

あなたはあなたのような各テーブルの既知の列名を持つマップを作成することができます軽量なソリューションが必要な場合:userColumns := map[string]bool {"id": true, ...}をしてからちょうど横にあるチェックを使用します。

if userColumns[f] { 
    ...you able to use f in sql... 
} else { 
    ...provided value is not one of known columns, it is an error... 
} 
関連する問題