本文介绍go中grom
的使用。ORM(Object Relation Mapping, 关系对象映射)
可以把Golang Struct模型对象映射到关系型数据库结构中。
介绍
gorm 是使用 golang 语言开发的 ORM 库,源码地址:https://github.com/go-gorm/gorm
关系型数据库与Golang对象的对应关系如下:
关系型数据库 |
Golang |
表 |
struct |
列 |
struct attr |
行数据 |
struct 对象 |
数据库操作 |
struct 对象方法的调用 |
gorm 的部分特性:
type Abc struct {
ID uint `gorm:"primaryKey;auto_increment"`
Name string `gorm:"type:varchar(32); size:32; not null; unique; default:''"`
CreatedAt time.Time `gorm:"type:date"`
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
示例
package main
import (
"fmt"
"log"
"os"
"time"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // Slow SQL threshold
LogLevel: logger.Info, // Log level
IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
Colorful: false, // Disable color
},
)
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{Logger: newLogger})
if err != nil {
panic("failed to connect database")
}
// Migrate the schema
db.AutoMigrate(&Product{})
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1) // find product with integer primary key
db.First(&product, "code = ?", "D42") // find product with code D42
fmt.Println(product)
var p1 Product
db.Last(&p1)
fmt.Println(p1)
var ps []Product
db.Find(&ps, "code like ?", "D%")
fmt.Println(ps)
// Update - update product's price to 200
db.Model(&product).Update("Price", 200)
// Update - update multiple fields
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - delete product
db.Delete(&product, 1)
}