ayumin.log

読みにくかったら脳内sedで整形してね

備忘録: 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後のテーブル構成がすぐに把握できなかった。

反省

ハッカソンみたいな短時間での開発は焦ってハマりがちなので気を付ける。