Open5

PostgreSQL と ORM と Logging について語る会

SpiegelSpiegel

実はこの本とは別件で

https://github.com/zenn-dev/zenn-community/issues/333

という issue を上げていたのだが mermaid 側の動きが芳しくなく Zenn 側で調整を行ったようだ(感謝!)。この影響かどうか分からないが(たぶん違うと思うが)

graph LR
User((User<From>)) -- Edge<owned> --> BinaryFile((BinaryFile<To>))
BinaryFile -- Edge<owner> --> User

という記述が

になってしまった。 < ... > の部分がまるっと抜け落ちてしまう。というわけで,この部分をちょっと書き換えて

graph LR
User((From#User)) -- owned --> BinaryFile((To#BinaryFile))
BinaryFile -- owner --> User

とした。これで

という表示になる。ふむむ。 mermaid は難しい。

SpiegelSpiegel

もしかしたら付録として収録するかも知れないけど github.com/smallnest/gen パッケージに関する話。

smallnest/gen では RDBMS に登録済みのスキーマ定義から GORM 用のモデル構造体を吐いてくれる便利 CLI ツールで, GitHub 上でコードのみ公開されている。内部で cgo を要求するパッケージ(多分 github.com/mattn/go-sqlite3)があるせいだと思う。特に Windows では別途 GCC ツールチェーンが必要となる。

最初 Scoop で導入しようとしたが

$ scoop install gcc
Installing 'gcc' (9.3.0-2) [64bit]
mingw-w64-x86_64-binutils-2.34-1-any.pkg.tar.xz (13.9 MB) [===================================================] 100%
Checking hash of mingw-w64-x86_64-binutils-2.34-1-any.pkg.tar.xz ... ok.
mingw-w64-x86_64-crt-git-8.0.0.5815.9517d302-1-any.pkg.tar.xz (3.1 MB) [======================================] 100%
Checking hash of mingw-w64-x86_64-crt-git-8.0.0.5815.9517d302-1-any.pkg.tar.xz ... ok.
The remote server returned an error: (404) Not Found.
URL http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-expat-2.2.9-1-any.pkg.tar.xz is not valid

という感じに途中でエラーになってしまった。しょうがないので自分の過去記事を参考にインストーラをダウンロードして手動でインストールした。

https://text.baldanders.info/remark/2018/03/mingw-w64/

何でも書いておくものである(笑)

って 8.1.0 が最新かよ orz

あと smallnest/gen は内部で diff コマンドを呼び出すらしい。これも Winsows 環境にはないので別途インストールする必要がある(ググっても Windows なら fc コマンドで代替できるとか GUI ツールがお勧めとしか出てこないがw)。 Scoop なら diffutils をインストールすればよい。

ビルド&インストールは Go 1.17 以降なら

$ go install github.com/smallnest/gen@latest

でOKだが,バージョンタグがついている v0.9.27 は2020年8月にリリースされたもので,これをそのまま使うと PostgreSQL の bytea 型を sql.NullString に変換という恐ろしい挙動をする。これを回避するには mapping.json を手直ししてコマンドラインで指定するか,上の go install を使わずに git clone で最新コミットを取ってきて go build でビルドするのがいいだろう。

他にも --run-gofmt オプションを付けないと lint で warning 出まくりのコードになるとか,雛形の BeforeSave() メソッドの引数が何故か脱落してしまい実行時に GORM に怒られるとか,色々あって一筋縄ではいかない感じである。