データベース操作を実行するためのgolangコードの技術方法の一つにsqlcを使う方法があります。今回は、goのsqlcライブラリについて紹介します。

CRUDとは

CRUDとは、4つの基本操作のことを言います。

  • C は、Create のことです。データベースに新しいレコードを挿入することを表します。
  • R は、Readのことです。データベースからレコードを取得することを表します。
  • U は、Updateのことです。データベース内のレコードの内容を変更することを表します。
  • D は、Deleteのことです。データベースからレコードを削除することを表します。

データベースアクセスするライブラリ

go言語を利用してdbアクセスするためのコードを書く方法はいくつかあります。

標準パッケージdatabase/sqlパッケージ

1つ目は、標準ライブラリとして提供されているデータベース/ SQLパッケージです。

sql発行自体は、利用者が書く必要があります。下記がデータベースに対するUpdate操作のサンプルです。

database/sql

シンプルなため、処理は高速です。

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アクセスコードが自動生成されるのは魅力を感じでいます。お疲れさまでした。