おなかへり
このアカウントは、notestockで公開設定になっていません。
ぼかしてるからふわっとしたデータモデルだけど
* ユーザーは実績を獲得する
* ユーザーのアクティビティが記録される
* 一部のアクティビティを起因として実績を獲得する場合がある
* このデータモデルだと変かもだけど、アクティビティに起因しないで獲得する実績もある
という感じで、nullableになるのを避ける為activitiesとuser_achivementsの関係をhasOneとbelongsToの関係にしたくないから、交差テーブルを置くんだけど、多対多に見えちゃう。
なのでユニーク制約をつけるけど外部キー制約もあって、PK, FK, UKとインデックス貼りすぎに見えて不安になってくる。
FKが欲しいインデックスがUKで賄える場合、FKは重複したインデックスは作らないみたいだし、必要な制約だから間違いじゃないはずだとは思うものの・・・
良い加減Goでmysqlに接続するときにDSNを直書きするのはやめない?github.com/go-sql-driver/mysql
のmysql.Config{}
使うとDSNを文字列で組み立てなくても良いの、この前知ったのでメモ #Golang
ChatGPTに設計についての質問をすると、具体例を挙げて聞いてるのに最後に一般論をくっつけてきがち。「要件に応じて適切に検討することが重要です。」とか、要件に応じて検討してるから今質問してるとこですやんという気持ち。
Custom instructionsで、具体的な話をしてる時に一般論を付け加えないで欲しいって書いたけど、あんまり効いてる気がしないんだよなぁ
Golangでメール送信のモジュール探すと、go.modも持ってない古いのばっかだなぁ。記事もnet/smtpでやってるのばかりだし、Golangらしく標準パッケージから先は書いたらいいやんのやつか・・・
けどnet/smtpだとマルチバイト対応とかもしないとみたいだし、地味にしんどいなぁ。使うとこだけ書けば、そんなでかいコードにはならんだろうけど、試行錯誤する手間と考慮漏れの心配を考えると、まぁまぁ重たい
package datastore
import "database/sql"
type number interface {
int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64
}
func LastInsertId[T number](result sql.Result) (T, error) {
lastInsertId, err := result.LastInsertId()
if err != nil {
return T(0), err
}
return T(lastInsertId), nil
}
itemId, err := datastore.LastInsertId[uint64](result)
Golang、database/sqlのresult.LastInsertId()
がidカラムの型がなんであってもint64で、uint64とかuint32で欲しい時のためにこんなヘルパー関数も作ったのに全くの無駄だった。result, err = db.NewInsert().Model(item).Exec(ctx)
if err != nil {
return 0, err
}
// この時点でitem.Idにautoincrementで発番されたid入ってた
lastInsertId, err := result.LastInsertId()
if err != nil {
return 0, err
} // この4行は要らなかったんや・・・
結論として見通しの悪い書き方をしてた自分が悪かったという落ちに。