はじめに
- こんにちはRIN1208です。今回はgolangのormであるxormに触れてみたのでそちらについて書いていきたいと思います。
実行環境
- DockerCompose
- Goの実行環境 ver.1.13
- VScode(お好みのエディタ)
以上の環境がある前提で書かせていただきます
コンテナを立てる
version: "3"
services:
mysql:
image: mysql:5.6
container_name: some-mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=hoge
command: >
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--innodb_file_per_table
--innodb_file_format=BARRACUDA
--innodb_large_prefix=1
ports:
- 3306:3306
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- 8000:80
environment:
- PMA_HOST=mysql
- PMA_PASSWORD=root
- PMA_USER=root
- PMA_ARBITRARY=1
links:
- mysql
depends_on:
- mysql
こちらのファイルを作成したのちに以下のコマンドでコンテナを立ち上げます。
phpmyadminは入力した値などを確認しやすくする為に使用しております。
$ docker-compose up -d
DBに書き込んだりしてみる
まずは簡単なデータを入力するコードです。はじめですので全体のコードを記載しておきます。
package main
import (
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/xorm"
)
type User struct {
Id int64 `xorm:"'id'"`
Name string `xorm:"'name'"`
Password string `xorm:"'password'"`
}
func main() {
engine, _ := xorm.NewEngine("mysql", "root:root@tcp([127.0.0.1]:3306)/hoge?charset=utf8mb4&parseTime=true")
_ = engine.Sync2(new(User)) //こちらの部分ではマイグレーションの処理をしています。
var user User
user.Name = "name"
user.Password = "huga"
engine.Insert(user) //こちらの部分では書き込みをしています。
}
Insert
var user User
user.Name = "name"
user.Password = "huga"
engine.Table("user").Insert(user)
上記のコードは入力のコードです。Insert(user)でDBに対して書き込みます。
またInsert()の中にstructのsliceを入れるをorm側でバルクインサート(英:bulk insert)してくれるみたいです。この部分はGORMにはなく個人で実装するとなると少し面倒なのでありがたいです。
var hoge, huga User
var user []User
hoge.Name = "hoge"
hoge.Password = "hoge"
huga.Name = "huga"
huga.Password = "huga"
user = append(user, hoge)
user = append(user, huga)
engine.Table("user").Insert(&user)
Find
var users []User
_ = engine.Table("user").Find(&users)
Findを使用してusersに対しTable名がuserのデータを格納しています
Where
var users []User
_ = engine.Table("user").Where("name = ?", "hoge").Find(&users)
こちらではWhereを使ってnameがhogeのデータを検索しusersに格納しています。
また以下のようにAndやOrの条件もつけることができます
var users []User
engine.Where("name = ?", "hoge").Or("name = ?", "huga").Find(&users)
// Andも同様に書くことができます。
engine.Where("name = ?", "hoge").And("Password = ?", "huga").Find(&users)
Table
すでに上のコードでは書いてしまっていますがTable("デーブル名")でテーブル指定をすることができます。
var users []User
_ = engine.Table("user").Find(&users)
Col
以下のようにColでカラムも指定することができます。
engine.Cols("name").Find(&users)
// SELECT name FROM user
Updata
以下のようにnameがhogeのデータをupdateで更新することができます。
engine.Where("name = ?", "hoge").Update(&user)
Migrate
こちらはマイグレートの部分です。GORMのAutoMigrate(&Data{})みたいな感覚です。
type User struct {
Id int64 `xorm:"'id'"`
Name string `xorm:"'name'"`
Password string `xorm:"'password'"`
}
_ = engine.Sync2(new(User))
終わりに
ここまで読んでくださりありがとうございます。xormはgormに書き方がとても似ている為xormを触り始めたばかりでもgormを少しでも使ったことがあれば扱いやすくとてもいいと思いました。触り始めたばかりで勉強中の為学んだことを随時こちらの記事に更新していければ思っております。また間違っている点などがございましたらコメントなどで指摘していただけると幸いです。