Gorm框架
https://gorm.io/zh_CN/docs/index.html
The fantastic ORM library for Golang aims to be developer friendly.
特性
全功能 ORM
关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
Create,Save,Update,Delete,Find 中钩子方法
支持 Preload、Joins 的预加载
事务,嵌套事务,Save Point,Rollback To Saved Point
Context、预编译模式、DryRun 模式
批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
复合主键,索引,约束
Auto Migration
自定义 Logger
灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
每个特性都经过了测试的重重考验
开发者友好
安装包
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
go get -u gorm.io/driver/mysql
如何连接到mysql数据库,如果是其他数据库,请参考官方文档
https://gorm.io/zh_CN/docs/connecting_to_the_database.html
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
//连接到数据库
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
username := "mall"
password := "?"
host := "rm-uf6t9m0yx22dxrya5no.mysql.rds.aliyuncs.com"
port := 3306
dbname := "mall"
//port端口是数字所以是%d
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, dbname)
//dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
//测试是否连接数据库成功?
if err != nil {
panic("数据库连接遇到问题,失败了,失败原因" + err.Error())
}
fmt.Println(db)
}
封装一下数据库conn
conn.go
package db
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func DBConnection() *gorm.DB {
//连接到数据库
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
username := "mall"
password := "??"
host := "rm-uf6t9m0yx22dxrya5no.mysql.rds.aliyuncs.com"
port := 3306
dbname := "mall"
//port端口是数字所以是%d
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, dbname)
//dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
//测试是否连接数据库成功?
if err != nil {
panic("数据库连接遇到问题,失败了,失败原因" + err.Error())
}
fmt.Println(db)
//返回值是啥?db
//db *DB, err error
return db
}
直接利用代码中的struct,新建数据库表
package main
import (
"Gorm/db"
"time"
)
type User struct {
//PY key,主键设定,自动增长,名字必须叫ID
ID int64
UserName string
Avatar string
Password string
Email string
Age uint8
Amount float32
Birthday time.Time
CreateTime time.Time
UpdateTime time.Time
}
func main() {
//1获取连接
db := db.DBConnection()
//2注册生成表
err := db.AutoMigrate(&User{})
if err != nil {
fmt.Println("新建table出现问题,", err)
} else {
fmt.Println("数据库表新建成功")
}
}