Go PR

【Go言語(Golang)】XORMによるデータベース操作 -ORM入門-

XORMによるデータベース操作 -ORM入門-
記事内に商品プロモーションを含む場合があります

こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。Go言語が好きです。

XORMによるデータベース操作を勉強しながら、ORM入門したので、備忘録も兼ねて本記事を書きます。

ORM(Object Relational Mapping)とは

ORM(Object Relational Mapping)とは、プログラミング言語で扱う型とデータベースから抽出したレコードを紐づける処理のことです。

SQL検索結果をGoの構造体にマッピングする処理という説明の方が直感的で分かり易いかもしれません。

ORMを使うことで、Goの型とデータベースのテーブルを透過的に扱うことができるため、生のSQL文を使わずに関数を使って SELECT や INSERT などのSQLクエリを組み立てる機能(クエリビルダ)をもつライブラリもあります。

ORMの役割
  • SQL検索結果とGoの型を紐づけるマッパー
  • クエリビルダ※

※クエリビルダがないライブラリもあります

人気のORM for Golang

GitHubスター数やブログ記事の多さから、以下のORMが有名どころです。

他にもありますが、紹介しきれないので、良質なGoの記事を数多く公開しているフューチャー技術ブログの中から一部をピックアップして紹介します。

XORMの採用した理由

今回は数多くあるORMの中から XORM を採用しました。いくつか理由はありますが、公式リポジトリに「(試験的とはいえ)Oracle の Driver をサポートしている」という説明があったのが決め手となりました。

普段メインで使っている RDB は PostgresSQLite ですが、Oracle を使用する機会もあるので、1つのORMで全てのRDBをカバーしたいと考えました。

はやぶさ
はやぶさ
○○のORMもPostgres/SQLite/Oracleをサポートしてるよ!などの情報があればシェアして頂けると嬉しいです

実践 XORMでデータベース操作 -ORM入門-

ここからはXORMの基本的な使い方を説明します。

プロジェクトフォルダの構成

プロジェクトフォルダの構成は以下の通りです。

※今回は SQLite を使います(手軽なので)。user.dbcreate.py で生成します

go.mod -バージョン管理-

go.mod は以下の通りです。

Create(テーブルおよびレコード作成)

XORMでCRUD(Create/Read/Update/Delete)やっていきます。まずは create.go から。

このコードで作成したテーブルを適当なツールで可視化したものが下図です。

xormでレコード作成

色んな書き方で Insert(レコード作成) しているように見えますが、やっていることはGoで定義したUserという構造体にデータを格納し、それをテーブルに登録しているだけです

engine.ShowSQL(true)としておけば、下記などの生SQLを確認できます。

INSERT INTO user (id,name,age,created,updated) VALUES (?, ?, ?, ?, ?) []interface {}{1, “Kururu”, 5, “2021-09-11 02:13:50”, “2021-09-11 02:13:50”}

Read(読み出し)

続いて read.go で任意のレコードを検索して読み出します。

======== Hayabusa info =========
[{2 Hayabusa 300 2021-09-11 02:13:50 +0000 UTC 2021-09-11 02:13:50 +0000 UTC}]
========= users info ==========
[{1 Kururu 5 2021-09-11 02:13:50 +0000 UTC 2021-09-11 02:13:50 +0000 UTC} {2 Hayabusa 300 2021-09-11 02:13:50 +0000 UTC 2021-09-11 02:13:50 +0000 UTC} {3 Nyoro 4 2021-09-11 02:13:50 +0000 UTC 2021-09-11 02:13:50 +0000 UTC}]
======= user id=1 info ========
{1 Kururu 5 2021-09-11 02:13:50 +0000 UTC 2021-09-11 02:13:50 +0000 UTC}
I love Kururu
========= Kururu info ==========
[map[age:5 id:1 name:Kururu]]

分かり易いクエリビルド、かつ検索結果が構造体にマッピングされるのでGoでの扱いが楽です。

生SQLも使えるので、過去に書いたSQLをそのまま流用できます。

Update(更新)

今度は update.go で任意のレコードを更新します。

更新前

xormでレコード作成

更新後

xormでレコード更新

「構造体のデータ編集=レコード更新」という手軽さです。

engine.ID(2).Get(&user)とすれば任意Idのレコードを読み出せます。

Delete(削除)

最後に delete.go でId=3のレコードを削除します。

削除前

xormでレコード更新

削除後

xormでレコード削除

更新と同様の手軽さです。

その他のデータベース操作

その他の操作については、公式サイトをご参照ください。

スポンサーリンク

まとめ

本記事で以下のことを紹介しました。

本記事で学んだこと
  • ORMについて
  • ORM for Goの1つ XORM の基本的な使い方(CRUD)

ORM入門したい人やGo言語(Glang)でデータベース操作したい人の参考になれば嬉しいです。

はやぶさ
はやぶさ
Goに関する情報共有しながら一緒に成長できたら嬉しいです。よろしくお願いします

以下 Go言語の本紹介。最初の一冊は「みんなのGo言語」がオススメです。

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python