1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-28

はじめに

  • こんにちは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

    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を少しでも使ったことがあれば扱いやすくとてもいいと思いました。触り始めたばかりで勉強中の為学んだことを随時こちらの記事に更新していければ思っております。また間違っている点などがございましたらコメントなどで指摘していただけると幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1