我们推荐使用配置组件来管理数据库配置,并使用g
对象管理模块中的g.DB
("数据库分组名称")方法获取数据库操作对象,数据库对象将会自动读取配置组件中的相应配置项,并自动初始化该数据库操作的单例对象。数据库配置管理功能使用的是配置管理组件实现(配置组件采用接口化设计默认使用文件系统实现),同样支持多种数据格式如:toml/yaml/json/xml/ini
。默认并且推荐的配置文件数据格式为yaml
。
一个简单的数据库配置如下:
database:
default:
type: "mysql"
link: "root:12345678@tcp(127.0.0.1:3306)/test"
user:
type: "mysql"
link: "root:12345678@tcp(127.0.0.1:3306)/user"
也可以将type
数据库类型写到link
配置项中,以上简化为:
database:
default:
link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
user:
link: "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
不同数据类型对应的link
如下:
类型 | link配置 | 更多参数 |
mysql |
mysql: 账号:密码@tcp(地址:端口)/数据库名称 | mysql |
pgsql |
pgsql: user=账号 password=密码 host=地址 port=端口 dbname=数据库名称 | pq |
mssql |
mssql: user id=账号;password=密码;server=地址;port=端口;database=数据库名称;encrypt=disable | go-mssqldb |
sqlite |
sqlite: 文件绝对路径 (如: /var/lib/db.sqlite3) | go-sqlite3 |
oracle |
oracle: 账号/密码@地址:端口/数据库名称 | go-oci8 |
完整的config.yaml
数据库配置项的数据格式形如下:
database:
分组名称:
host: "地址"
port: "端口"
user: "账号"
pass: "密码"
name: "数据库名称"
type: "数据库类型(mysql/pgsql/mssql/sqlite/oracle)"
link: "(可选)自定义数据库链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效,但是type必须有值"
role: "(可选)数据库主从角色(master/slave),不使用应用层的主从机制请均设置为master"
debug: "(可选)开启调试模式"
prefix: "(可选)表名前缀"
dryRun: "(可选)ORM空跑(只读不写)"
charset: "(可选)数据库编码(如: utf8/gbk/gb2312),一般设置为utf8"
weight: "(可选)负载均衡权重,用于负载均衡控制,不使用应用层的负载均衡机制请置空"
timezone: "(可选)时区配置,例如:local"
maxIdle: "(可选)连接池最大闲置的连接数"
maxOpen: "(可选)连接池最大打开的连接数"
maxLifetime: "(可选)连接对象可重复使用的时间长度"
createdAt: "(可选)自动创建时间字段名称"
updatedAt: "(可选)自动更新时间字段名称"
deletedAt: "(可选)软删除时间字段名称"
timeMaintainDisabled: "(可选)是否完全关闭时间更新特性,true时CreatedAt/UpdatedAt/DeletedAt都将失效"
完整的数据库配置项示例(YAML
):
database:
default:
host: "127.0.0.1"
port: "3306"
user: "root"
pass: "12345678"
name: "test"
type: "mysql"
role: "master"
debug: "true"
dryrun: 0
weight: "100"
prefix: "gf_"
charset: "utf8"
timezone: "local"
maxIdle: "10"
maxOpen: "100"
maxLifetime: "30s"
使用该配置方式时,为保证数据库安全,默认底层不支持多行SQL
语句执行。为了得到更多配置项控制,请参考推荐的简化配置,同时建议您务必了解清楚简化配置项中每个连接参数的功能作用。
gdb
的配置支持集群模式,数据库配置中每一项分组配置均可以是多个节点,支持负载均衡权重策略,例如:
database:
default:
- link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
role: "master"
- link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
role: "slave"
user:
- link: "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
role: "master"
- link: "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
role: "slave"
- link: "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
role: "slave"
gdb
支持日志输出,内部使用的是glog.Logger
对象实现日志管理,并且可以通过配置文件对日志对象进行配置。默认情况下gdb
关闭了DEBUG
日志输出,如果需要打开DEBUG
信息需要将数据库的debug
参数设置为true
。以下是为一个配置文件示例:
database:
logger:
path: "/var/log/gf-app/sql"
level: "all"
stdout: true
default:
link: "mysql:root:12345678@tcp(127.0.0.1:3306)/user_center"
debug: true
其中database.logger
即为gdb
的日志配置,当该配置不存在时,将会使用日志组件的默认配置。
需要注意:由于ORM
底层都是采用安全的预处理执行方式,提交到底层的SQL
与参数其实是分开的,因此日志中记录的完整SQL
仅作参考方便人工阅读,并不是真正提交到底层的SQL
语句。
以下为数据库底层管理配置介绍,如果您对数据库的底层配置管理比较感兴趣,可继续阅读后续章节。
gdb
数据库管理模块的内部配置管理数据结构如下:
type Config map[string]ConfigGroup // 数据库配置对象
type ConfigGroup []ConfigNode // 数据库分组配置
// 数据库配置项(一个分组配置对应多个配置项)
type ConfigNode struct {
Host string // 地址
Port string // 端口
User string // 账号
Pass string // 密码
Name string // 数据库名称
Type string // 数据库类型:mysql, sqlite, mssql, pgsql, oracle<br /> Link string // (可选)自定义链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效(该字段是一个扩展功能) Role string // (可选,默认为master)数据库的角色,用于主从操作分离,至少需要有一个master,参数值:master, slave
Debug bool // (可选)开启调试模式
Charset string // (可选,默认为 utf8)编码,默认为 utf8
Prefix string // (可选)表名前缀
Weight int // (可选)用于负载均衡的权重计算,当集群中只有一个节点时,权重没有任何意义
MaxIdleConnCount int // (可选)连接池最大闲置的连接数
MaxOpenConnCount int // (可选)连接池最大打开的连接数
MaxConnLifetime time.Duration // (可选,单位秒)连接对象可重复使用的时间长度
}
ConfigNode
用于存储一个数据库节点信息;ConfigGroup
用于管理多个数据库节点组成的配置分组(一般一个分组对应一个业务数据库集群);Config
用于管理多个ConfigGroup
配置分组。
配置管理特点:
ConfigNode.Type
属性进行配置;
Master-Slave
读写分离,可通过ConfigNode.Role
属性进行配置;
ConfigNode.Weight
属性进行配置,值越大,优先级越高;特别说明,gdb
的配置管理最大的特点是,(同一进程中)所有的数据库集群信息都使用同一个配置管理模块进行统一维护,不同业务的数据库集群配置使用不同的分组名称进行配置和获取。
这是原生调用gdb
模块来配置管理数据库。如果开发者想要自行控制数据库配置管理可以参考以下方法。若无需要可忽略该章节。
接口文档: https://pkg.go.dev/github.com/gogf/gf/v2/database/gdb
// 添加一个数据库节点到指定的分组中
func AddConfigNode(group string, node ConfigNode)<br />
// 添加一个配置分组到数据库配置管理中(同名覆盖)
func AddConfigGroup(group string, nodes ConfigGroup)
// 添加一个数据库节点到默认的分组中(默认为default,可修改)
func AddDefaultConfigNode(node ConfigNode)<br />
// 添加一个配置分组到数据库配置管理中(默认分组为default,可修改)
func AddDefaultConfigGroup(nodes ConfigGroup)
// 设置默认的分组名称,获取默认数据库对象时将会自动读取该分组配置
func SetDefaultGroup(groupName string)
// 设置数据库配置为定义的配置信息,会将原有配置覆盖
func SetConfig(c Config)
默认分组表示,如果获取数据库对象时不指定配置分组名称,那么gdb
默认读取的配置分组。例如:gdb.NewByGroup()
可获取一个默认分组的数据库对象。简单的做法,我们可以通过gdb
包的SetConfig
配置管理方法进行自定义的数据库全局配置,例如:
gdb.SetConfig(gdb.Config {
"default" : gdb.ConfigGroup {
gdb.ConfigNode {
Host : "192.168.1.100",
Port : "3306",
User : "root",
Pass : "123456",
Name : "test",
Type : "mysql",
Role : "master",
Weight : 100,
},
gdb.ConfigNode {
Host : "192.168.1.101",
Port : "3306",
User : "root",
Pass : "123456",
Name : "test",
Type : "mysql",
Role : "slave",
Weight : 100,
},
},
"user-center" : gdb.ConfigGroup {
gdb.ConfigNode {
Host : "192.168.1.110",
Port : "3306",
User : "root",
Pass : "123456",
Name : "test",
Type : "mysql",
Role : "master",
Weight : 100,
},
},
})
随后,我们可以使用gdb.NewByGroup("数据库分组名称")
来获取一个数据库操作对象。该对象用于后续的数据库一系列方法/链式操作。
gredis组件支持两种方式来管理redis配置和获取redis对象,一种是通过配置组件+单例对象的方式;一种是模块化通过配...
ASP.NET CheckBoxList RepeatDirection 属性 CheckBoxList 控件定义和用法 RepeatDirection 属性用于获取或设置 CheckBoxList 中...
ASP.NET Calendar SelectorStyle 属性 Calendar 控件定义和用法 SelectorStyle 属性用于设置或返回周和月选择器的样式。 语法asp...
ASP.NET Button UseSubmitBehavior 属性 Button 控件定义和用法 UseSubmitBehavior 属性规定 Button 控件使用客户端浏览器内建的...
本节我们一起来学习 ECharts 中 yAxis 是如何设置其坐标轴指示器的文本标签的。首先,需要将文本标签显示出来,使用的是 axisPoi...
polar.tooltip.formatter |string, Function提示框浮层内容格式器,支持字符串模板和回调函数两种形式。字符串模板模板变量有{a}...