关系数据

简要概述

基于框架 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否falsetrue是否开启初始化数据库
driverenable 时必填-mysql / postgres数据库类型,仅支持这两个值
dbnameenable 时必填-demo库名
usernameenable 时必填-demo用户名
passwordenable 时必填-passwd口令
protocol否tcptcp / 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否30m1800s空闲连接最长存活时间,超时回收
max_life_time否6h21600s连接最长生命周期,超时重建
max_idle_conns否3300空闲连接数上限
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_permissions
  • lion_permission_bindings
  • lion_resource_scopes
  • lion_permissions
  • lion_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
}