beego orm根據模型自動生成mysql數據表

前言:

有時候我們不行通過手動的方式寫sql語句來建表,而是通過程序的方式自動建表,例如php的laravel框架的遷移文件就是一個典型的實線,那麼GO語言的beego orm框架是否有類似的解決方案呢?本文章主要來研究一下這個問題。在閱讀本編文章之前,我們假設本地已經裝有MySQL數據庫或者已經有可遠程連接的MySQL

實踐步驟

1、新建一個工程,工程名爲:dblearn (可自定義)

2、生成工程的go.mod

# 在dblearn目錄下打開cmd命令行 執行如下命令:
go mod init dblearn

3、編寫工程的main.go

package main

import (
	"fmt"
	"os"

	"github.com/beego/beego/v2/client/orm"
	_ "github.com/go-sql-driver/mysql"

	_ "dblearn/models"
)

func init() {
	// 鏈接數據庫
	dbUsername := "root"
	dbPassword := ""
	host := "127.0.0.1"
	port := 3306
	dbName := "demo"

	dataSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", dbUsername, dbPassword, host, port, dbName)
	if err := orm.RegisterDataBase("default", "mysql", dataSource); err != nil {
		fmt.Println("conn mysql db so give up. err:", err)
		os.Exit(1)
	}

	// 根據模型創建數據庫(執行數據庫遷移文件)
	// 第二個參數:最容易出錯的地方,如果值爲ture時,表已經存在並且表中有值的情況下,它會先刪除原來的表,然後重新創建,這樣原表中的數據就全部丟失了。
	// 第三個參數:是否輸出建表的sql日誌 true:輸出 false:不輸出
	if err := orm.RunSyncdb("default", false, true); err != nil {
		fmt.Println("orm.RunSyncdb err:", err)
	}
}

func main() {

}

4、新建一個models目錄

5、編寫models/users.go文件

package models

import (
	"time"

	"github.com/beego/beego/v2/client/orm"
)

type User struct {
	Id        int       `orm:"auto;pk"`                                  // auto:當 Field 類型爲 int, int32, int64, uint, uint32, uint64 時,可以設置字段爲自增健;pk:主鍵
	Username  string    `orm:"size(32);type(char)"`                      // 多個設置間使用 ; 分隔,設置的值如果是多個,使用 , 分隔。設置 - 即可忽略 struct 中的字段
	Mobile    string    `orm:"unique"`                                   // 爲單個字段增加 unique 鍵
	Password  string    `orm:"column(pwd)"`                              // 爲字段設置 數據庫 字段的名稱
	Gender    int       `orm:"index;default(1);description(性別:1 男 2 女)"` // index:爲單個字段設置普通索引;default:設置默認值,description:字段註釋
	Avatar    string    `orm:"null;size(100)"`                           // 數據庫表默認爲 NOT NULL,設置 null 代表 ALLOW NULL;size:string 類型字段默認爲 varchar(255),設置 size 以後,db type 將使用 varchar(size),如果想char類型則加type(char)
	Money     float64   `orm:"digits(8);decimals(2)"`                    // 設置 float32, float64 類型的浮點精度,總長度 8 小數點後 2 位 eg: 999999.99
	CreatedAt time.Time `orm:"auto_now_add;type(datetime)"`              // auto_now_add 第一次保存時才設置時間
	UpdatedAt time.Time `orm:"auto_now;type(datetime)"`                  // auto_now 每次 model 保存時都會對時間自動更新;type:設置爲 date 時,time.Time 字段的對應 db 類型使用 date,設置爲 datetime 時,time.Time 字段的對應 db 類型使用 datetime
}

func init() {
	orm.RegisterModel(new(User))
}

// 自定義表名 (默認模型名小寫)
func (u *User) TableName() string {
	return "users"
}

// 設置引擎爲 INNODB
func (u *User) TableEngine() string {
	return "INNODB"
}

// 聯合唯一鍵
func (u *User) TableUnique() [][]string {
	return [][]string{
		[]string{"Mobile", "Username"},
	}
}

// 普通聯合 索引
func (u *User) TableIndex() [][]string {
	return [][]string{
		[]string{"Gender", "Username"},
	}
}

6、運行項目,可看到如下日誌輸出:

總結:

通過以上項目我們已經知道通過模型的orm tag可以自定義數據表的字段,且通過orm.RunSyncdb觸發自動建表。但是這種方式有明顯的缺點:1.只支持首次建表,不支持字段更新的操作,這種方式顯然不能滿足商業化應用。那怎麼才能讓orm做到像laravel一樣的效果呢?下一篇文章我們再來介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章