golangのormであるxormを使ってみた

# はじめに
- こんにちはRIN1208です。今回はgolangのormであるxormに触れてみたのでそちらについて書いていきたいと思います。

# 実行環境
- DockerCompose
- Goの実行環境 ver.1.13
- VScode(お好みのエディタ)

以上の環境がある前提で書かせていただきます

# コンテナを立てる

```docker-compose.yml
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に書き込んだりしてみる
まずは簡単なデータを入力するコードです。はじめですので全体のコードを記載しておきます。

```main.go
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
```go
    var user User
    user.Name = "name"
    user.Password = "huga"
    engine.Table("user").Insert(user) 
```
上記のコードは入力のコードです。Insert(user)でDBに対して書き込みます。
またInsert()の中にstructのsliceを入れるをorm側でバルクインサート（英：bulk insert）してくれるみたいです。この部分はGORMにはなく個人で実装するとなると少し面倒なのでありがたいです。

```go
    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
```go
    var users []User
    _ = engine.Table("user").Find(&users)
```
Findを使用してusersに対しTable名がuserのデータを格納しています

## Where
```go
    var users []User
    _ = engine.Table("user").Where("name = ?", "hoge").Find(&users)
```
こちらではWhereを使ってnameがhogeのデータを検索しusersに格納しています。
また以下のようにAndやOrの条件もつけることができます

```go
    var users []User
    engine.Where("name = ?", "hoge").Or("name = ?", "huga").Find(&users)
    // Andも同様に書くことができます。
    engine.Where("name = ?", "hoge").And("Password = ?", "huga").Find(&users)
```

## Table

すでに上のコードでは書いてしまっていますがTable("デーブル名")でテーブル指定をすることができます。

```go
    var users []User
    _ = engine.Table("user").Find(&users)
```

##Col
以下のようにColでカラムも指定することができます。

```go
    engine.Cols("name").Find(&users)
    // SELECT name FROM user
```

## Updata
以下のようにnameがhogeのデータをupdateで更新することができます。

```go
    engine.Where("name = ?", "hoge").Update(&user)
```

##Migrate
こちらはマイグレートの部分です。GORMのAutoMigrate(&Data{})みたいな感覚です。


```go
    type User struct {
        Id       int64   `xorm:"'id'"`
        Name     string  `xorm:"'name'"`
        Password string  `xorm:"'password'"`
    }
    _ = engine.Sync2(new(User))
```


#終わりに
ここまで読んでくださりありがとうございます。xormはgormに書き方がとても似ている為xormを触り始めたばかりでもgormを少しでも使ったことがあれば扱いやすくとてもいいと思いました。触り始めたばかりで勉強中の為学んだことを随時こちらの記事に更新していければ思っております。また間違っている点などがございましたらコメントなどで指摘していただけると幸いです。