【Golang】Kraを使用してRDBに接続してみた!

6月 5, 2022

どもども、ボディバッグが欲しくて延々とECサイトを旅している僕です。


さて、昨日国内最大規模のGopherイベントである Go conference 2022 spring が開催されましたね!
https://gocon.jp/2022spring/


当日は僕も参加させていただき、登壇者様たちの非常に興味深い発表を拝聴させていただきました。せっかく様々なナレッジを共有して頂いたので、さっそく試してみましょうというということで今回はISIDの佐藤太一さんが発表してくださったRDBアクセスヘルパーライブラリのKraを実際に使用してみたいと思います。


Github
https://github.com/taichi/kra
ご本人様登壇資料
https://drive.google.com/file/d/1lsF7q74o0Akewk-5rUb9Jt9nA2MqpDDw/view

Kraの特徴

READMEを参照すると、Kraは

kra is a relational database access helper library on top of go.

であるとしています。


また、登壇資料にもあるとおりGoの標準パッケージであるdatabase/sqlをラップしているので、かなり馴染みのある使用感となっています。


登壇資料にもある通り、標準パッケージの仕様を理解している人であれば使い方がある程度想像がつくようになっています。


まさに素直に使用できるライブラリといったところでしょうか。

使ってみる

何はともあれ早速使用してみましょう。まずは接続先DBを用意します。今回はDockerをしようしてPostgreSQLエンジンのDBコンテナを用意します。

version: '3'

services:
  db:
    image: postgres:14
    container_name: postgres
    ports:
      - 5432:5432
    volumes:
      - db-store:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test
      POSTGRES_DB: test
volumes:
  db-store:

yamファイルが用意できたらコンテナを立ち上げておきましょう。

$ docker compose up -d

DBの準備はこれで完了です。コードを書いていきましょう。まずはOpen関数を使用してDBに接続するところまで確認してみます。

package main

import (
	"context"
	"fmt"

	"github.com/taichi/kra/pgx"
)

func main() {
	ctx := context.Background()
	db, _ := pgx.Open(ctx,
		"user=test password=test host=localhost port=5432 database=test sslmode=disable")
	fmt.Println(db)
	defer db.Close()
	}
}

ドライバインポートの必要がないのが嬉しいですね!コンテキストは今回は登壇資料と同様一旦空のものを用意しています。実行してみると接続情報のメモリアドレスが返ってきています。

$ go run main.go
&{0xc000130690 0xc00007b700 0}

次に今回資料するテーブルを作成し、データをインサートします。

package main

import (
	"context"

	"github.com/taichi/kra/pgx"
)

func main() {
	ctx := context.Background()
	db, _ := pgx.Open(ctx,
		"user=test password=test host=localhost port=5432 database=test sslmode=disable")
	defer db.Close()

	db.Query(ctx,
		"CREATE TABLE users(id integer, name varchar(10))")

	db.Query(ctx,
		"INSERT INTO users VALUES (1, 'test_user')")
}

最後にテーブル内のデータを読み出してみましょう。Kraでは用意した構造体に自動でマッピングしてくれるので各要素を指定せずに構造体丸ごとに対してScanを行うことができます。

package main

import (
	"context"
	"fmt"

	"github.com/taichi/kra/pgx"
)

func main() {
	ctx := context.Background()
	db, _ := pgx.Open(ctx,
		"user=test password=test host=localhost port=5432 database=test sslmode=disable")

	defer db.Close()

	type User struct {
		Id   int
		Name string
	}

	rows, _ := db.Query(ctx,
		"SELECT id, name FROM users")
	defer rows.Close()
	for rows.Next() {
		user := User{}
		rows.Scan(&user) // &user.ID などは不要
		fmt.Printf("%+v\n", &user)
	}
}

実行すると先ほどインサートしたデータが読み出されていることが確認できます。

$ go run main.go
&{Id:1 Name:test_user}

標準パッケージライクな使い方ができてキャッチアップがスムーズでした。

まとめ

こんかいはKraを使用したRDBの接続、クエリ操作を行なってみました。


本記事で紹介した内容の他に、標準パッケージに比べプレースホルダーや名前付きパラメータを使用したクエリの記述方法がよりシンプルになっていたり、IN句プレースホルダーの自動拡張(個人的に一番感動した機能)など、より直感的にコードをかけるように工夫されています。


登壇資料に上記の使用例もあるので是非チェックしてみてください。


最後まで読んでいただきありがとうございました!

本日のオススメ

Golang

Posted by CY