備忘録: Goでバックエンド書いた時にハマったところ
久々にエンドポイント作った
echo+sqlxでバックエンド書いた時に出たミスをいくつか。
db変数をグローバルで宣言してない
var db *sqlx.DB func main(){ var err error db, err = db.Open("省略") }
SQL叩いてnil pointerとか言われた時はまずこれを疑おう。大抵の場合ハンドラのdbがスコープ外で宣言されてるせいで死んでる。
distrolessを使う時
静的リンクしたGoのバイナリを使う場合、alpineでも大して問題はないが、せっかくなのでdistrolessを使ったところハマった。 中でシェル使って動作確認~とか思って、その場合debugというtagを付けるとbusyboxのシェルが使えると聞いてたので、やってみた。
FROM gcr.io/distroless/static:debug
すると静的リンクしたGoのバイナリがなぜか開けなくなり、コンテナが起動できなくなるエラーが出た。ELFとかでエラー出てたので、ひょっとするとArmマシンだとうまくいかないのかもしれない。 debug使わなければ何も問題なかったので、少なくともArmマシンでシェルに入りたい時はalpineとか使うことにする。なおシェルに入らなければdebugいらないので問題ない。
DBに日本語入れる時
データ自体は問題ないが、シェルで直接SQL叩いて検証とかやりたくなるので、DBも日本語対応しておこう。 mariaDBをDockerで立てる場合、
[mysql] default-character_set=utf8mb4 [mysqld] character-set-server=utf8mb4
とか設定ファイル書いておき、/etc/mysql/conf.d
ディレクトリに設定ファイルをコピーしてやればいける。
ハマってないけど後から見てハマりかけていたところ
複数行JOIN時
SQLで複数テーブルをカラムAでjoinしたテーブルに対してWHEREでまたカラムAを絞り込む時、
... WHERE tbl_name.columnA = ?
のようにすると分かりやすい。してなかったので、見返した時にJOIN後のテーブル構成がすぐに把握できなかった。
反省
ハッカソンみたいな短時間での開発は焦ってハマりがちなので気を付ける。