iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
0
Modern Web

BeeGo系列 第 4

ORM(1)

  • 分享至 

  • xImage
  •  

ORM 其實要講很多東西,這篇我們先講這幾個部份,model 的操作下一篇再來講。

  • 安裝
  • 產生、定義 model
  • Migration
  • 程式與設定

安裝

首先要安裝 BeeGo 的 ORM 函式庫以及 SQLite3 的函式庫

go get github.com/astaxie/beego/orm
go get github.com/go-sql-driver/mysql

用 SQLite3 是最方便的,但 BeeGo 的工具 bee 不支援產生 sqlite 的 migration,所以我們使用 MySQL。為了避免安裝的麻煩,我們用 docker 來啟動。

docker run --name beego-mysql -e MYSQL_DATABASE=hellodb -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql:5.7

如果有需要使用 MySQL CLI 的話,可以用

docker run -it --link beego-mysql --rm mysql:5.7 mysql -h beego-mysql -P 3306 -u root -p

產生、定義 model

先切換到之前建立的 hello 目錄下,執行 bee generate model

cd $GOPATH/src/my/hello
bee generate model User -fields="name:string,gender:string,birthday:datetime"

此時,會在 models 目錄下看到有 user.go 這個檔案

$ tree models 
models
└── user.go

0 directories, 1 file

這個檔案裡,就定義了 User 這個 model 的欄位以及相關 CRUD 操作的程式。

Migration

為了在使用 bee 時,可以不用輸入太長的參數,我們先建立一個 bee.json 檔,bee 會在執行時去讀取這個檔案。

envs 是表示設定執行 bee 時的環境變數,database 則是資料庫連接資訊。

{
  "envs": [
    "ORM_DRIVER=mysql",
    "ORM_SOURCE=root:my-secret-pw@/hellodb?charset=utf8"
  ],
  "database": {
    "driver": "mysql",
    "conn": "root:my-secret-pw@/hellodb?charset=utf8"
  }
}

要注意,conn 的語法跟熟知的 DATABASE_URL 不太一樣,格式是這樣的::@tcp(:)/<database_name>?"。如果有需要改成自己的 MySQL 主機的話,請參考格式來做調整。

新增好 bee.json 以後,就可以執行 bee generate migration 了。

bee generate migration user -fields="name:string,gender:string,birthday:datetime"
# 檔案會在 database/migrations
bee migrate

程式與設定

程式的部份主要是使用 orm 去註冊資料庫的資訊就可以了,這邊我們稍稍改寫一下,讓程式可以讀取環境變數 ORM_DRIVER/ORM_SOURCE 來取得資料庫連接的資訊。

package main

import (
        "fmt"
        _ "my/hello/routers"
        "os"

        "github.com/astaxie/beego"
        "github.com/astaxie/beego/orm"
        _ "github.com/go-sql-driver/mysql" // import your required driver
)

var DBARGS = struct {
        Driver string
        Source string
        Debug  string
}{
        os.Getenv("ORM_DRIVER"),
        os.Getenv("ORM_SOURCE"),
        os.Getenv("ORM_DEBUG"),
}

func init() {
        Debug, _ := orm.StrTo(DBARGS.Debug).Bool()

        fmt.Printf("Debug=%v\n", Debug)
        if Debug {
                fmt.Printf("ORM config=%v\n", DBARGS)
        }
        if DBARGS.Driver == "" || DBARGS.Source == "" {
                fmt.Println("Please set ORM_DRIVER/ORM_SOURCE")
                os.Exit(2)
        }

        // set default database
        orm.RegisterDataBase("default", DBARGS.Driver, DBARGS.Source, 30)
}

func main() {
        beego.Run()
}

上一篇
Project Layout 與設定
下一篇
ORM(2)
系列文
BeeGo30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言