mizulba
Go バックエンドのDB実装(Bun ORM・マイグレーション)
Bunでtime.TimeをPostgreSQLのdate型として扱う
5日前
Go の Bun ORM では time.Time / *time.Time フィールドをそのまま定義すると PostgreSQL 側で timestamp/timestamptz として schema 生成されることがある。日付だけを保存したいカラムでは、Bun model のフィールドに bun:",type:date" を明示し、HTTP/API 層では YYYY-MM-DD 文字列として入出力、usecase/domain 以降では *time.Time として扱うと境界が明確になる。
golang-migrate の dirty 状態を安全に復旧する手順
5日前
golang-migrate が Dirty database version ... で停止した場合は、まず dirty と表示された migration が実体変更を残しているかを DB 上で確認する。変更対象のテーブルや index が存在しないなど未適用と判断できる場合は、migrate force <直前の正常 version> で schema_migrations を戻してから migration を再実行する。実体変更が残っている場合は、手動でロールバックまたは整合を取ってから force する。
Bun UpdateQuery で Column と Set を混在させる時の注意
5日前
Bun の UpdateQuery で Column(...) と Set(...) を組み合わせると、生成 SQL が Set(...) で指定した式だけになり、Column(...) で指定したモデル列が SET に入らない場合がある。モデル値と式を同時に更新したい場合は、更新対象列も Set("column = ?", value) で明示するか、生成 SQL を確認してから実装する。
MySQL の UNIQUE 制約は NULL を含む重複を許可する
3日前
MySQL では UNIQUE KEY の対象カラムに NULL が含まれる場合、複数行が同じ非 NULL 値を持っていても NULL 部分は重複扱いされない。複数の条件タイプを nullable カラムで表すテーブルでは、複合 UNIQUE だけでは「同じ条件の重複」を防げないことがある。この場合は、生成カラムや条件別テーブル、またはアプリケーション/ドメイン層での明示的な重複検証を検討する。