关系数据
2 分钟阅读
简要概述
基于框架 ent 使用,当前仅支持 mysql 与 postgres 两种关系型数据库。
在代码目录下以下不可删除,其他文件为自动生成:
modeler/ent/entc.go
modeler/ent/generate.go
modeler/ent/schema/*.go
配置示例
# 关系数据配置
database:
enable: true
driver: postgres
#driver: mysql
dbname: demo
username: demo
password: password
address: 127.0.0.1:5432
parameters: "sslmode=disable"
connection_pool:
max_idle_time: 1800s
max_life_time: 21600s
max_idle_conns: 300
max_open_conns: 300
mysql 对应示例:
database:
enable: true
driver: mysql
dbname: demo
username: demo
password: password
address: 127.0.0.1:3306
parameters: ""
数据结构
// DatabaseConfig 数据库设置,指关系数据库,数据不允许丢失,如postgres、mysql
type DatabaseConfig struct {
Enable bool `mapstructure:"enable"`
Driver string `mapstructure:"driver"`
Username string `mapstructure:"username"`
Password string `mapstructure:"password"`
Protocol string `mapstructure:"protocol"`
Address string `mapstructure:"address"`
DBName string `mapstructure:"dbname"`
Parameters string `mapstructure:"parameters"`
ConnectionPool ConnectionPool `mapstructure:"connection_pool"`
}
type ConnectionPool struct {
MaxIdleTime time.Duration `mapstructure:"max_idle_time"`
MaxLifeTime time.Duration `mapstructure:"max_life_time"`
MaxIdleConns int `mapstructure:"max_idle_conns"`
MaxOpenConns int `mapstructure:"max_open_conns"`
}
配置参数
| 名称 | 是否必填 | 默认值 | 示例 | 用途 |
|---|---|---|---|---|
| enable | 否 | false | true | 是否开启初始化数据库 |
| driver | enable 时必填 | - | mysql / postgres | 数据库类型,仅支持这两个值 |
| dbname | enable 时必填 | - | demo | 库名 |
| username | enable 时必填 | - | demo | 用户名 |
| password | enable 时必填 | - | passwd | 口令 |
| protocol | 否 | tcp | tcp / unix | 连接协议,仅 mysql 驱动使用(postgres 连接串不经过该字段) |
| address | 否 | 按驱动区分 | 127.0.0.1:5432 | 数据库连接地址;mysql 默认 127.0.0.1:3306,postgres 默认 127.0.0.1:5432 |
| parameters | 否 | - | sslmode=disable | 附加连接参数,见下方连接串构造规则 |
| connection_pool | 否 | 见下表 | - | 连接池设置 |
连接串构造规则
不同驱动的 DSN 拼装方式不同,这决定了 parameters 的写法:
mysql: username:password@protocol(address)/dbname?parameters
postgres: postgres://username:password@address/dbname?parameters
- postgres 本地连接未启用 TLS 时,必须设置
parameters: "sslmode=disable", 否则连接握手失败; - mysql 常见的
parseTime、charset等参数也通过parameters传递。
连接池 connection_pool
| 名称 | 是否必填 | 默认值 | 示例 | 用途 |
|---|---|---|---|---|
| max_idle_time | 否 | 30m | 1800s | 空闲连接最长存活时间,超时回收 |
| max_life_time | 否 | 6h | 21600s | 连接最长生命周期,超时重建 |
| max_idle_conns | 否 | 3 | 300 | 空闲连接数上限 |
| max_open_conns | 否 | 0(不限制) | 300 | 打开连接数上限 |
默认值为代码内的兜底值:未配置
connection_pool或单项为零值时生效。 本地开发可按需缩小,例如max_idle_time: 5m、max_open_conns: 10。
启动行为与迁移
启用数据库时,dbname、username、password 必须非空;连接 Ping 失败会使 Init 返回错误。模板业务 IndependentCfg.Init 执行 ent Schema.Create,失败会返回错误。自动建表不能代替生产数据库迁移评审与备份。
启用 Admin 后,lion 初始化当前会删除以下旧授权表(DROP TABLE IF EXISTS),然后执行 schema 创建:
lion_role_permissionslion_permission_bindingslion_resource_scopeslion_permissionslion_scopes
升级前备份并核对历史数据用途;回退二进制不能恢复这些表。Admin 的 Schema.Create 错误当前记录 warning,并非统一使启动失败。数据库未启用时可出现 admin service database unavailable 降级日志;数据库已启用但连接失败时仍会先在 Init 阶段失败。
生产密码与连接参数按数据库环境配置。sslmode=disable 仅作为本地未启用 TLS 的 PostgreSQL 示例,不套用于生产。驱动连接串目前直接拼装,特殊字符凭据应验证转义及连接行为。
添加业务模型
添加表
在路径 “modeler/ent/schema/” 添加代码,如:“modeler/ent/schema/user.go”
package schema
import (
"entgo.io/ent"
"entgo.io/ent/schema/field"
)
// User holds the schema definition for the User entity.
type User struct {
ent.Schema
}
// Fields of the User.
func (User) Fields() []ent.Field {
return []ent.Field{
field.Int("age").Positive(),
field.String("name").Default("unknown"),
field.String("email").Default("unknown"),
field.String("address").Default("unknown"),
}
}
// Edges of the User.
func (User) Edges() []ent.Edge {
return nil
}