Go之Gorm和BeegoORM簡介及配置使用
簡介
ORM
Object-Relationl Mapping, 它的作用是映射資料庫和對象之間的關係,方便我們在實現資料庫操作的時候不用去寫複雜的sql語句,把對資料庫的操作上升到對於對象的操作
Gorm
gorm就是基於Go語言實現的ORM庫。
類似於Java生態里大家聽到過的Mybatis、Hibernate、SpringData等。
下載使用Gorm庫
下載gorm庫
go get -u github.com/jinzhu/gorm
// 這是比較原始的方式,現在有了go mod,我們可以更方便的配置,甚至不用配置。
// 寫好程式碼,在文件下執行go build,go.mod會自動添加對於gorm的依賴包
CURD
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"os"
"time"
)
const (
dbUser string = "test"
dbPassword string = "ZHOUjian.22"
dbHost string = "121.36.43.223"
dbPort int = 3306
dbName string = "cmdb"
)
var dsn string = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&loc=Local&parseTime=true",
dbUser, dbPassword, dbHost, dbPort, dbName)
type User3 struct {
// 會從gorm嵌入一些欄位進來
gorm.Model
Name string
Password string
Birthday time.Time
Sex bool
Tel string
Addr string
Desc string
}
type User4 struct {
Id int `gorm: "primary_key; auto_increment"`
Name string
Password string
Birthday time.Time
Sex bool
Tel string
Addr string
Desc string
}
func (*User4)TableName() string {
return "user"
}
//type User4 struct {
// Id int `gorm:"primary_key"`
// Name string `gorm:"type:varchar(32);unique;not null; default:''"`
// Password string
// Birthday time.Time `gorm:"type:date"`
// Sex bool
// Tel string `gorm:"column:telephone"`
// Addr string
// Desciption string `gorm:"type:text"`
//}
func main() {
db, err := gorm.Open("mysql", dsn)
if err != nil {
fmt.Println(err)
os.Exit(-1)
}
// 創建表
db.AutoMigrate(&User3{})
db.AutoMigrate(&User4{})
// fmt.Println(db.CreateTable(&User3{},&User4{}))
//db.Model(&User{}).AddIndex("idx_name_addr", "name", "addr")
db.Close()
}
判斷表是否存在
// 判斷表是否存在
fmt.Println(db.HasTable(&User3{}))
fmt.Println(db.HasTable("user4"))
db.Close()
刪除表
fmt.Println(db.DropTable(&User3{},&User4{}))
修改表
db.Model(&User3{}).ModifyColumn("birthday","date")
db.Close()
刪除列
db.Model(&User3{}).DropColumn("birthday")
添加刪除索引
db.Model(&User3{}).AddIndex("idx_name","name")
// 聯合索引 db.Model(&User3{}).AddIndex("idx_name_addr","name","addr")
db.Close()
// 刪除索引
db.Model(&User3{}).RemoveIndex("idx_name_addr")
// 創建UniqueIndex索引
db.Model(&User3{}).AddUniqueIndex("idx_name","name")
BeegoORM
配置BeegoORM
package main
import (
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
ID int
Name string
Gender bool
Tel string
Height float32
}
func main() {
// 0. 導入包
// 1. 註冊驅動
// 2. 註冊資料庫
// 3. 定義數據模型 model
// 4. 註冊數據模型
// 5. 操作
// 同步表結構
// 數據: 增,刪,改,查
dsn := "test:ZHOUjian.22@tcp(121.36.43.223:3306)/cmdb?charset=utf8mb4&parseTime=true&loc=PRC"
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", dsn)
// 創建User表
orm.RegisterModel(new(User))
orm.RunCommand()
}
Beego_orm運行參數
// 將orm要創建的表呈現為sql
go run beego_rom.go orm sqlall
-- --------------------------------------------------
-- Table Structure for `main.User`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
`i_d` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(255) NOT NULL DEFAULT '' ,
`gender` bool NOT NULL DEFAULT FALSE ,
`tel` varchar(255) NOT NULL DEFAULT '' ,
`height` double precision NOT NULL DEFAULT 0
) ENGINE=InnoDB;
// 同步資料庫
// -force 強制創建,先刪在創建
// -v verbose info 創建過程將創建的表sql列印出來
go run beego_rom.go orm syncdb
table `user1` already exists, skip
add column `main.User1.Salary` for table `user1`