Edited at

【Go言語のフレームワークBeego】ORMの使い方


BeegoのORマッパー


  1. 準備

    データベース構造のモデルを用意

  2. SELECT


  3. INSERT


  4. UPDATE

  5. InsertOrUpdate

  6. DELETE



1. 準備


  • Userテーブル

ID
NAME

1
鈴木

2
佐藤


  • Profileテーブル

ID
Age
User

1
鈴木
1

2
佐藤
2


model.go

package main

import (
"github.com/astaxie/beego/orm"
)

type User struct {
Id int
Name string
}

type Profile struct {
Id int
Age int16
User *User `orm:"reverse(one)"` // Reverse relationship (optional)
}


Delete(interface{}) (int64, error)

LoadRelated(interface{}, string, …interface{}) (int64, error)
QueryM2M(interface{}, string) QueryM2Mer
QueryTable(interface{}) QuerySeter
Using(string) error
Begin() error
Commit() error
Rollback() error
Raw(string, …interface{}) RawSeter
Driver() Driver
}


  • BeegoではQueryTableを使用してDBを操作するQuerySeterを作成する。

  • QueryTableの引数は「”テーブル名”」または「モデルをNewしたもの」

o := orm.NewOrm()

// テーブル名直打ち
qs := o.QueryTable("user")

- // モデル(Struct)を使った場合
user := new(User)
qs = o.QueryTable(user) // return a QuerySeter


2. SELECT


sample.go

// すべてのデータの場合

o := NewOrm()
var users []User
o.QueryTable("user").Filter("Id", 1).All(&users, "Id", "Name")

// 単一データの場合
var users []User
o.QueryTable("user").Filter("Id", 1).All(&users, "Id", "Name")



  • Filterは条件

  • QueryTableはテーブル名(モデルも使える)


3. Insert


  • 単一行のINSERTの場合

はじめに各ORMの関数一覧と戻り値の型の確認

Insert(interface{}) (int64, error)

InsertMulti(int, interface{}) (int64, error)


sample.go

o := orm.NewOrm()

var user User
user.Name = "谷岡"

id, err := o.Insert(&user) //戻り値のIdはint64
if err == nil {
fmt.Println(id)
}



  • 複数行のINSERTの場合


sample.go

o := NewOrm()

users := []User{
{Name: "slene"},
{Name: "astaxie"},
{Name: "unknown"},
...
}
successNums, err := o.InsertMulti(len(users), users)


4.UPDATE

はじめに各ORMの関数一覧と戻り値の型の確認

Update(interface{}, …string) (int64, error)

o := orm.NewOrm()

user := User{Id: 1}
if o.Read(&user) == nil {
user.Name = "MyName"

//戻り値のnumはint64
if num, err := o.Update(&user); err == nil {
fmt.Println(num)
}
}


5 Insert or Update


sample.go

o := NewOrm()

var user User
user.id = "1"
user.Name = "鈴木さん"
r, e := o.InsertOrUpdate(user) //モデルの値によって主キーを検索し、存在すれば更新、存在しなければ挿入処理を行う。
r, e := o.InsertOrUpdate(user, "name=鈴木君") //modelにない値の指定は第二引数で行う

InsertOrUpdate()を使用する場合注意点があり、structのormの記述にautoを入れると全て新規レコードとしてinsertされてしまいます。


models.go

type Shikaku struct {

// pkにautoは必要なし
Shikaku_id int64 `orm:"pk"` //ここにautoを設定しては行けない
Shikaku_name string `json:"shikakuName"`


6.DELETE

はじめに各ORMの関数一覧と戻り値の型の確認

Delete(interface{}) (int64, error)

o := NewOrm()

//戻り値のnumはint64
o.Delete(&User{Id: 1}) //userテーブルのIDが1のレコードを削除


生のSQLを書く方法

直接クエリを書く場合


sample01.go

o := NewOrm()

var r orm.RawSeter
r = o.Raw("select user WHERE name = ?", "佐藤")
// r {[id:2, name:佐藤]} |


別途まとめました

BeegoのORMの使い方(RAWで生のSQLを書く)

URL:DMLの使い方(公式)