-1

次の例のような SQL 選択ステートメントがあります。

queryValues = make([]interface{}, 0, 5)

queryValues = append(Name, obj.Name)
queryValues = append(Age, obj.Age)
whereClause := "where name = $1 and age = $2"    

query := fmt.Sprintf("Select * from Table1  %s;", whereClause)

rows, err := dbConnection.Query(query, queryValues...)

ここでいくつか質問があります。queryValues の後の ... は何ですか? データベースに渡されるクエリを見ると、実際に $1 が実際の値に変換されていないのはなぜですか?

渡される前に表示できるように、dbConnection.Query(query, queryValues...) を模倣するために実行できる印刷関数は何ですか?

前もって感謝します。

ジョシュ

4

1 に答える 1

0

あなたの最初の質問に対する答えは、 Query は可変引数関数https://golang.org/ref/spec#Function_typesと呼ばれるものです。最後の型の任意の数のパラメーターを取り、スライスとして関数に渡されます。

queryValues... はその逆です。スライスを取得し、それらを個々の引数としてクエリに渡します。それはあなたがしたかのように同じことをしています:

dbConnection.Query(query, queryValues[0], queryValues[1])

https://golang.org/ref/spec#Passing_arguments_to_..._parameters

この特定のケースでは、[]interface{} は必要ありません。

dbConnection(query, obj.Name, obj.Age)

$1、$2 プレースホルダーが変換されない理由は、使用している特定のドライバーに対して間違ったプレースホルダーを使用している可能性があります。ドライバー自体に依存します。たとえば、MySQL ドライバーは「?」を使用します。それはプレースホルダーです。

于 2015-06-08T16:59:31.950 に答える