私が歌川です

@utgwkk が書いている

stephenafamo/bobでBIGINT型のカラムに対してGoのint64型じゃなくてint型を対応させたい

tl;dr

設定ファイルに以下のような記述を足したらよいです。

replacements:
  - tables: []
    match:
      db_type: 'bigint'
    replace: 'int'

仕組み

stephenafamo/bobはGoのO/Rマッパーで、DBスキーマの定義からGoのコードを生成することで型安全に扱えるという特徴を持っています。

stephenafamo/bobには、ドライバが推論した型を上書きするための設定項目があるので、これを利用して、全てのテーブルの BIGINT 型のカラムをGoの int 型に対応させるように上書きしています。

Goの int 型は64ビットとは限らないけど大丈夫なの?

Goの言語仕様をよく読むと、int 型について以下のように規定されています。

uint either 32 or 64 bits
int same size as uint

すなわち、int 型は処理系によって32ビットもしくは64ビット整数のいずれかを表しています。手元のパソコンやVM・Dockerコンテナではだいたい64ビットになっていると思います。より正確に調べるには unsafe.Sizeof(int(0)) の実行結果 (バイト数が表示される) を確認するとよいです。

一般的なWebアプリケーションの動作環境を念頭に置くと、現代で64ビットプロセッサが使えない環境をわざわざ選ぶ理由もないと思うし、まあいいんじゃないでしょうか。逆に、シビアな環境の場合は気にする意味が出てくると思います。

時間のないサイト運営者リング