2017-11-03 207 views
0

私はインターネット上の修正を見ることができないエラーが発生しています。私はgo-langには新しく、SQL文には何のエラーも見られません。私はgo-langで更新クエリを実行しています。コードは次のとおりです。golang sql:expected 0 arguments、got 1

sql = "UPDATE tablename SET id1='' WHERE id2=" +fmt.Sprint(v.acctId) 
_, err = db.Exec(sql, nil) 

id1とid2は両方ともvarcharです。 SQL文を文字列に入れて実行します。 idsの1つを削除しようとしましたが、それでもエラーが表示されます。また、私が気づいたのは、何らかの理由でv.acctIdの値が必ずしも同じではないということです。なぜ私はMySQLワークスペースでSQLステートメントを試したときにうまく動作するのかわかりません。

+0

このようなクエリにパラメータを挿入しないでください。適切な使い方については、[SQL Go Wikiページ](https://github.com/golang/go/wiki/SQLInterface)を参照してください。 –

+0

は、行がある部分です。err:= db.Query( "SELECT name FROM users from WHERE age = $ 1"、age) –

+0

db.Exec( "UPDATE tablename SET id1 = '' WHERE id2 = $ 1"、v。 acctId) ' – mkopriva

答えて

-1

db.Execは、次のシグネチャ

func (db *DB) Exec(query string, args ...interface{}) (Result, error) 

Argsのを持っているあなたが希望どおりにできるだけ多くのデータを置くことができることを意味し、可変引数パラメータです。しかし、Execに渡す変数ごとに、 "?"あなたのSQLクエリで。あなたがエラーを受けている理由は、あなたが何も渡すべきではない場所を渡しているということです。

変更

err = db.Exec(sql, nil) 

err = db.Exec(sql) 

するようにしてもそう

err = db.Exec(sql, fmt.Sprint(v.acctId)) 
のような幹部を実行後、次の

sql = "UPDATE tablename SET id1='' WHERE id2=?" 

にクエリをリファクタリングすることができます

+0

最初に問題を修正したようだ。私はすでにそれについて確信している場合私はそれを受け入れるよ。 –

-1

nilをExecの2番目の引数として渡している間に、パラメータプレースホルダ(postgresには$1、mysqlでは?と思われます)が指定されていない間は、エラーが発生しています。

が代わりにまた、この

db.Exec("UPDATE tablename SET id1='' WHERE id2=?", v.acctId) 

ような何かを、あなたはほとんどそれはSQLインジェクションにつながるとして、文字列を連結して、クエリを構築することはありません。したがって、paramプレースホルダを使用してください。

パラメータを持たないクエリを実行したい場合は、実行中の処理をnilを第2引数として渡さないでください。

db.Exec(sql) 
関連する問題