どーも!
先日goのgormにて使っててむむ?ってなったことを書いておきます。
Updateで複数カラムを同時に更新したい
GoにてDBを更新したかったんですが、以下の公式ドキュメントではnameカラムを指定して更新することができます。
他のageなどは仮に値がちゃんと入っていても指定されていないので、更新されないわけです。
そこまでは良かったんですが...
では複数指定したい場合ってどうすればいいの...?
と。
// nameカラムを更新
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
// ageカラムを更新
db.Model(&user).Select("age").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
こんな方法が真っ先に思いつきましたが、流石にかっこ悪いw
そこでSelectで複数指定できればいいんじゃね?っておもって、色々試していたんですが...
なかなかできず...
// 悪い例①
db.Model(&user).Select("name, age").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
// 悪い例②
db.Model(&user).Select("name", "age").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
んー・・・こんな感じでできると思ったんだけど...
全然だめでした...orz
結局色々と試してみて、以下のように引数に配列として渡してあげればうまくいきました。
db.Model(&user).Select([2]string{"name", "age"}).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
んー・・・。
"name, age"でできないのは不具合だったりするのだろうか...?
わざわざ配列にしないといけないのはなんか違和感...
一応色々調べてはみたんですが、SELECT文のselectは複数指定がありました。(こっちはUPDSTEではなく単純なSELECTです)。
ここで"name, age"で実行できてたのでちょっと違うメソッドではあるけど、UPDATEのselectでもできるもんだと思ったらできず...って感じです。
また、以下のissueにて同様の現象に遭遇している人がいたけど、普通にselect("name","age")でいけていたそう...
あれ・・・勘違いだったかな...
確かにできなかった気が...
まぁ、配列を使ってできたのでいいかっ!
まとめ
go言語はまだまだ触り始めで手探り状態なんですが...
最近少しずつ読めるようになってきて楽しくなってきてます...!
今回のもあたりまえにできると思っていたけど、そんなことはないんだなぁ〜と思い知りましたね!
決めつけいくない!
っというわけで、皆さんもupdateで複数カラム指定したい場合はよかったら参考にしてみてくださいね!
それでわ!