データベース操作を実行するためのgolangコードの技術方法の一つにsqlcを使う方法があります。今回は、goのsqlcライブラリについて紹介します。
目次
CRUDとは
CRUDとは、4つの基本操作のことを言います。
- C は、Create のことです。データベースに新しいレコードを挿入することを表します。
- R は、Readのことです。データベースからレコードを取得することを表します。
- U は、Updateのことです。データベース内のレコードの内容を変更することを表します。
- D は、Deleteのことです。データベースからレコードを削除することを表します。
データベースアクセスするライブラリ
go言語を利用してdbアクセスするためのコードを書く方法はいくつかあります。
標準パッケージdatabase/sqlパッケージ
1つ目は、標準ライブラリとして提供されているデータベース/ SQLパッケージです。
sql発行自体は、利用者が書く必要があります。下記がデータベースに対するUpdate操作のサンプルです。
シンプルなため、処理は高速です。
Gorm
2つ目は、a high-level object-relational-mapping library for GolangのGormです。
- レコード生成には、NewRecord(), Create()
- データ取得には、First(), Take(), Last(), Find()
を使います。Interfaceとして抽象化されているので、最初のうちは、それぞれの操作がSQLのどれにマッピングされるのか、学ぶ必要がある気がします。
データベースの関連などは、gormに理解させることで複数のテーブルをJointするようなSQLクエリーを生成できるようにする必要があります。
このライブラリは、慣れると利用するのが楽です。ただ、問題になる可能性があるのは、速度です。処理速度は、遅くなります。
sqlx
速度は保ちつつ標準なライブラリを利用したいという人がsqlxライブラリを使用することが多いです。
標準ライブラリとほぼ同じ速度で実行されます。フィールドのマッピングは、クエリテキストまたは構造体タグのいずれかを介して行われます。ただ、データベースから取得したデータのマッピングコード(DTO)が増えるので、コード量は多くなります。
sqlc
sqlcは、SQLクエリからgolang向けCRUDコードが自動的に生成するためのツールです。
実行時には、sqlcツールを返して作成したdbアクセスコード(=database/sql)を利用するので、速度も非常に早いです。
yamlベースの設定ファイル例
スキーマの配置場所、入力になるクエリ、生成したdataアクセスコードの吐き出すパスなどを指定します。
version: "1"
packages:
- name: "db"
path: "db/sqlc"
queries: "db/query/"
schema: "db/migrations/"
engine: "postgresql"
スキーマ例
テーブル定義です。
CREATE TABLE users (
id serial,
name text NOT NULL,
email text NOT NULL,
password text NOT NULL DEFAULT '',
registration_token text NOT NULL,
active boolean NOT NULL DEFAULT false,
created_at timestamp NOT NULL DEFAULT current_timestamp,
updated_at timestamp NOT NULL DEFAULT current_timestamp,
logined_at timestamp NOT NULL DEFAULT current_timestamp,
CONSTRAINT pk_users PRIMARY KEY(id)
);
sqlクエリ例
下記のように`– name: xxxx: one`という形で書くと1レコードの情報を取得するという意味です。$1,$2,..$nは、database/sqlでpostgresqlの変数を渡す際の書き方です。
-- name: GetUserByID :one
SELECT * FROM users WHERE id = $1;
-- name: GetUserByEmail :one
SELECT * FROM users
WHERE email = $1;
-- name: CreateUser :one
INSERT INTO users
(name, email, registration_token) VALUES ($1, $2, $3) RETURNING *;
dbアクセスコードの作成方法
sqlc generate
このコマンドを実行すると、設定ファイルで指定したpathにdbアクセスコードが作成されます。生成されたファイルは、db.go, models.go, querier.goとsqlクエリを元に生成されたxxx.sql.goというファイルです。
db.go
models.go
querier.go
user.sql.go
後は、golangからコードを利用するだけです。
golangで利用されるdbアクセスライブラリをさっと見てきました。個人的には、sqlxが好きでしたが、最近は、sqlcを使うことが多い気がします。DBを利用した開発時には、sqlを書くことが多いので、そのsqlをメンテすることでdbアクセスコードが自動生成されるのは魅力を感じでいます。お疲れさまでした。