使用golang gorm 库,github:https://github.com/go-gorm/gorm,
文档地址:https://gorm.io/docs。这里以操作mysql为例
# install gorm
go get -u gorm.io/gorm
# install gorm mysql driver
go get -u gorm.io/driver/mysql
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&…¶mN=valueN] 连接参数dsn由 用户名+密码@tcp(mysql服务器地址)/数据库名称?参数设置…
如果要正确处理struct中的time.Time类型要带上parseTime=True
gorm.Config 设置 DisableForeignKeyConstraintWhenMigrating=true,
我们不希望在迁移的时候将外键创建出来。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "root:Xrx@1994113@tcp(127.0.0.1:3306)/proxy?charset=utf8mb4&parseTime=True&loc=Local"
open, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true,
})
if err != nil {
panic(err)
}
fmt.Println(open)
}
模型就是一个struct,只不过要嵌入gorm.Model
// gorm.Model
//其中设置了数据库id,created_at,updated_at,deleted_at 字段,是由struct 属性名的蛇形变换得到,以UpdatedAt双驼峰为例,将驼峰小写并以 “_” 相连得到updated_at
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
type user struct {
gorm.Model
}
表名可以实现 Tabler 接口,不实现则以stuct名称的蛇形加复数
type User struct {
gorm.Model
Name string
Password string
}
//不设置 表名就是 users
func (u User) TableName() string {
return "user"
}
也可以不使用gorm.Model,使用自己定义的model去嵌入。这种方法通常用来解决自己的项目数据库字段不符合gorm.Model中定义的字段。如果是创建时间和修改时间字段和数据库中的字段不一样,不建议修改struct中的属性名(CreatedAt,UpdatedAt,DeletedAt),可以通过column:数据库字段名 来指定数据库字段,CreatedAt,UpdatedAt,DeletedAt会随着具体的操作而自动更新时间。
//CreatedAt 对应数据库中create_at
//UpdatedAt 对应数据库中update_at
type Model struct {
ID uint `gorm:"primarykey;"`
CreatedAt time.Time `gorm:"column:create_at"`
UpdatedAt time.Time `gorm:"column:update_at"`
}
type User struct {
Model
Name string
Password string
}
使用 AutoMigrate 根据 model struct 生成数据表
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
type User struct {
// 主键 自带auto_increment
//bigint unsigned auto_increment primary key
ID uint `gorm:"primarykey"`
//time.time(datetime(3)) 精确到秒,需要unix时间的将time.Time 换成 int
CreatedAt time.Time
UpdatedAt time.Time
//gorm中的index 代表建立普通索引
//未设置索引名,则默认生成的索引名 = idx + _表名 + _属性名的蛇形
//由于User未实现TableName,故表明为users
//索引名为 idx_users_deleted_at
DeletedAt gorm.DeletedAt `gorm:"index"`
//type 设置的是数据库字段类型 符合原生sql,default 设置默认值,comment设置备注
Name string `gorm:"column:name;type:varchar(50);default:kiki;comment:名称"`
Password string `gorm:"column:password;type:varchar(50);default:123456"`
}
func getConnect() *gorm.DB {
dsn := "root:Xrx@1994113@tcp(127.0.0.1:3306)/proxy?charset=utf8mb4&parseTime=True&loc=Local"
open, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
//禁止创建外键
DisableForeignKeyConstraintWhenMigrating: true,
})
if err != nil {
panic(err)
}
return open
}
func main() {
connect := getConnect()
//迁移时设置引擎和默认字符集
err := connect.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET UTF8").AutoMigrate(&User{})
if err != nil {
panic(err)
}
}
type User struct {
ID uint `gorm:"primarykey"`
}
Index:索引名
type User struct {
Name string `gorm:"type:varchar(50);Index:idx_name"`
}
uniqueIndex:索引名
type User struct {
Name string `gorm:"type:varchar(50);uniqueIndex:name_unique_ids"`
}
多个字段共用一个索引。联合索引遵循左前缀原则,可以通过设置 priority 优先级来调整字段索引的位置。priority 数值小的在左边,priority 相同则按照在struct中的位置排。priority 默认值 10
type User struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"type:varchar(50);Index:idx_name,priority:11"`
NickName string `gorm:"type:varchar(50);Index:idx_name,priority:12"`
}