2023-08-15 18:38:26 結城浩 / Hiroshi Yukiの投稿 hyuki@social.hyuki.net

このアカウントは、notestockで公開設定になっていません。

室内にいるのに暑さにやられてる様な感じがする・・水分足りてないのかな🫠

ぼかしてるからふわっとしたデータモデルだけど
* ユーザーは実績を獲得する
* ユーザーのアクティビティが記録される
* 一部のアクティビティを起因として実績を獲得する場合がある
* このデータモデルだと変かもだけど、アクティビティに起因しないで獲得する実績もある

という感じで、nullableになるのを避ける為activitiesとuser_achivementsの関係をhasOneとbelongsToの関係にしたくないから、交差テーブルを置くんだけど、多対多に見えちゃう。
なのでユニーク制約をつけるけど外部キー制約もあって、PK, FK, UKとインデックス貼りすぎに見えて不安になってくる。
FKが欲しいインデックスがUKで賄える場合、FKは重複したインデックスは作らないみたいだし、必要な制約だから間違いじゃないはずだとは思うものの・・・

良い加減Goでmysqlに接続するときにDSNを直書きするのはやめない?
github.com/go-sql-driver/mysqlmysql.Config{}使うとDSNを文字列で組み立てなくても良いの、この前知ったのでメモ

良い加減Goでmysqlに接続するときにDSNを直書きするのはやめない?

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で欲しい時のためにこんなヘルパー関数も作ったのに全くの無駄だった。
コードベースからは消しちゃうからここにメモ。似た様な関数作りたい時に見たいかもだし。generics使った書き方すぐ忘れちゃう

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行は要らなかったんや・・・
結論として見通しの悪い書き方をしてた自分が悪かったという落ちに。

https://twitter.com/kanonji/status/1633890358965989376
INSERTに使ったstructに発番したidが反映される事に気が付いてから、そういえばこれ1度確認したような気が薄っすらとするんだけど、Bunを使う前に調べてた時のスレッドにはメモされてない。メモしないから忘れてしまったのか・・・