🤩

【Go言語】"Bun"と呼ばれるORM触ってみた

2023/10/21に公開

なぜBun?

はじめはX(旧ツイッターw)でGORMよりBunだ!という投稿を見て興味がわき使い始めました。

筆者はORM初心者になります。何かあればコメントください。

Bunを利用したバックエンドの実装をOSSとして公開しています。

ミドラボというcommunityで誰でも簡単に利用できるようなゲームサーバーのサンプルを置いています(制作途中。。)
参考にしてください!!
https://github.com/MidraLab/basic-game-server-with-mysql

Bunについてざっくりと

  • 他のORMよりミニマムなLibrary(そもそもこのOSSを出しているところ(Uptrace社)はできる限りサイズの小さいライブラリを出すことを目指しているっぽい)
  • Uptraceが以前に出していたgo-pgのパワーアップバージョンとなるみたい。ただパフォーマンスはgo-pgの方がいいらしい。

使ってみた

DBへの接続部分

https://github.com/MidraLab/basic-game-server-with-mysql/blob/main/app/config/database.go
ここで接続するDBの情報を入れてOpenしてます。

        dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", user, password, host, port, database)

	sqldb, err := sql.Open("mysql", dsn)

モデルの操作部分

https://github.com/MidraLab/basic-game-server-with-mysql/blob/main/app/infrastructure/persistence/user_repository.go

        _, err := db.NewCreateTable().Model((*User)(nil)).Exec(context.Background())
	_, err := u.Conn.NewInsert().Model(user).Exec(ctx)
        _, err := u.Conn.NewUpdate().Model(uuser).Where("id = ?", uuser.Id).Exec(ctx)
	_, err := u.Conn.NewDelete().Model(user).Where("id = ?", id).Exec(ctx)
	err := u.Conn.NewSelect().Model(&user).Where("id = ?", id).Scan(ctx)
	

新しいテーブルの作成、挿入、取得、削除、更新などの宣言方法です。

テーブルと同じ型になっている構造体を入れるだけでDBが操作できるのはめちゃくちゃお手軽ですよね!個人的に標準のsqlパッケージだとSQL文の文字列で宣言しないといけなくて誤字がめちゃくちゃ多くなりそうだという不安点がありました。また、メソッドチェーンで操作できるので何が行われているのか明確で分かりやすいところも良きです。

まとめ

筆者にとって初めてのORMが今回のBunでした。他のORMライブラリもしっかり触ってよりよく自分に合った物を追い求めていきたいと思います。

MidraLab(ミドラボ)

Discussion