ORM 其實要講很多東西,這篇我們先講這幾個部份,model 的操作下一篇再來講。
首先要安裝 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
先切換到之前建立的 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 操作的程式。
為了在使用 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()
}