• 配置文件
  • 简化配置(推荐)
  • 原生配置(可选)
    • 数据结构
    • 配置方法

    配置文件

    推荐使用配置文件及单例对象来管理和使用数据库操作。

    如果我们使用g对象管理模块中的g.DB("数据库分组名称")方法获取数据库操作对象,数据库对象将会自动读取config.toml配置文件中的相应配置项(通过配置管理模块),并自动初始化该数据库操作的单例对象。

    数据库配置管理功能使用的是配置管理模块实现,因此同样支持多种数据格式如:toml, yaml, json, xml。默认并且推荐的配置文件数据格式为toml

    完整的config.toml数据库配置项的数据格式形如下:

    1. [database]
    2. [[database.分组名称]]
    3. host = "地址"
    4. port = "端口"
    5. user = "账号"
    6. pass = "密码"
    7. name = "数据库名称"
    8. type = "数据库类型(目前支持mysql/pgsql/sqlite)"
    9. role = "(可选)数据库主从角色(master/slave),不使用应用层的主从机制请均设置为master"
    10. debug = "(可选)开启调试模式"
    11. charset = "(可选)数据库编码(如: utf8/gbk/gb2312),一般设置为utf8"
    12. weight = "(可选)负载均衡权重,用于负载均衡控制,不使用应用层的负载均衡机制请置空"
    13. linkinfo = "(可选)自定义数据库链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效,但是type必须有值"
    14. max-idle = "(可选)连接池最大闲置的连接数"
    15. max-open = "(可选)连接池最大打开的连接数"
    16. max-lifetime = "(可选,单位秒)连接对象可重复使用的时间长度"

    完整的数据库配置项示例(TOML):

    1. [database]
    2. [[database.default]]
    3. host = "127.0.0.1"
    4. port = "3306"
    5. user = "root"
    6. pass = "12345678"
    7. name = "test"
    8. type = "mysql"
    9. role = "master"
    10. debug = "true"
    11. weight = "100"
    12. charset = "utf8"
    13. linkinfo = ""
    14. max-idle = "10"
    15. max-open = "100"
    16. max-lifetime = "30"

    篇幅有限,这里仅展示了推荐的toml格式的文件示例格式,其他配置文件的数据格式请自行研究。

    简化配置(推荐)

    为兼容不同的数据库类型,gdb将数据库的各个字段拆分出来单独配置,这样对于各种数据库的对接来说兼容性会很好。但是对于开发者来说看起来配置比较多。针对于项目中使用的已确定的数据库类型的配置,我们可以使用linkinfo属性(名称也可以简化为link)进行配置。如:

    1. [database]
    2. [[database.default]]
    3. type = "mysql"
    4. link = "root:12345678@tcp(127.0.0.1:3306)/test"
    5. [[database.user]]
    6. type = "mysql"
    7. link = "mysql:root:12345678@tcp(127.0.0.1:3306)/user"

    也可以简化为:

    1. [database]
    2. [[database.default]]
    3. link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
    4. [[database.user]]
    5. link = "mysql:root:12345678@tcp(127.0.0.1:3306)/user"

    注意以上每一项分组配置均可以是多个节点,支持负载均衡权重策略。如果不使用多节点负载均衡特性,仅使用配置分组特性,也可以简化为如下格式:

    1. [database]
    2. [database.default]
    3. link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
    4. [database.user]
    5. link = "mysql:root:12345678@tcp(127.0.0.1:3306)/user"

    如果仅仅是单数据库节点,不使用配置分组特性,那么也可以简化为如下格式:

    1. [database]
    2. link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"

    不同数据类型对应的linkinfo如下:

    数据库类型 Linkinfo配置 更多参数
    mysql [mysql:]账号:密码@tcp(地址:端口)/数据库名称 mysql
    pgsql [pgsql:]user=账号 password=密码 host=地址 port=端口 dbname=数据库名称 pq
    mssql [mssql:]sqlserver://用户:密码@地址:端口?database=数据库名称 go-mssqldb
    sqlite [sqlite:]文件绝对路径 (如: /var/lib/db.sqlite3) go-sqlite3
    oracle [oracle:]账号/密码@地址:端口/数据库名称 go-oci8

    各数据库类型更详细的linkinfo参数信息请查看对应引擎官网,参考【ORM数据库类型】章节

    原生配置(可选)

    以下为数据库底层管理配置介绍,如果您对数据库的底层配置管理比较感兴趣,可继续阅读后续章节。

    数据结构

    gdb数据库管理模块的内部配置管理数据结构如下:

    1. type Config map[string]ConfigGroup // 数据库配置对象
    2. type ConfigGroup []ConfigNode // 数据库分组配置
    3. // 数据库配置项(一个分组配置对应多个配置项)
    4. type ConfigNode struct {
    5. Host string // 地址
    6. Port string // 端口
    7. User string // 账号
    8. Pass string // 密码
    9. Name string // 数据库名称
    10. Type string // 数据库类型:mysql, sqlite, mssql, pgsql, oracle(目前仅支持mysql)
    11. Role string // (可选,默认为master)数据库的角色,用于主从操作分离,至少需要有一个master,参数值:master, slave
    12. Debug bool // (可选)开启调试模式
    13. Charset string // (可选,默认为 utf8)编码,默认为 utf8
    14. Weight int // (可选)用于负载均衡的权重计算,当集群中只有一个节点时,权重没有任何意义
    15. Linkinfo string // (可选)自定义链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效(该字段是一个扩展功能)
    16. MaxIdleConnCount int // (可选)连接池最大闲置的连接数
    17. MaxOpenConnCount int // (可选)连接池最大打开的连接数
    18. MaxConnLifetime int // (可选,单位秒)连接对象可重复使用的时间长度
    19. }

    ConfigNode用于存储一个数据库节点信息;ConfigGroup用于管理多个数据库节点组成的配置分组(一般一个分组对应一个业务数据库集群);Config用于管理多个ConfigGroup配置分组。

    配置管理特点:

    1. 支持多节点数据库集群管理;
    2. 每个节点可以单独配置连接属性;
    3. 采用单例模式管理数据库实例化对象;
    4. 支持对数据库集群分组管理,按照分组名称获取实例化的数据库操作对象;
    5. 支持多种关系型数据库管理,可通过ConfigNode.Type属性进行配置;
    6. 支持Master-Slave读写分离,可通过ConfigNode.Role属性进行配置;
    7. 支持客户端的负载均衡管理,可通过ConfigNode.Priority属性进行配置,值越大,优先级越高;

    特别说明,gdb的配置管理最大的特点是,(同一进程中)所有的数据库集群信息都使用同一个配置管理模块进行统一维护,不同业务的数据库集群配置使用不同的分组名称进行配置和获取。

    配置方法

    这是原生调用gdb模块来配置管理数据库。如果开发者想要自行控制数据库配置管理可以参考以下方法。若无需要可忽略该章节。

    接口文档:https://godoc.org/github.com/gogf/gf/g/database/gdb

    1. // 添加一个数据库节点到指定的分组中
    2. func AddConfigNode(group string, node ConfigNode)
    3. // 添加一个配置分组到数据库配置管理中(同名覆盖)
    4. func AddConfigGroup(group string, nodes ConfigGroup)
    5. // 添加一个数据库节点到默认的分组中(默认为default,可修改)
    6. func AddDefaultConfigNode(node ConfigNode)
    7. // 添加一个配置分组到数据库配置管理中(默认分组为default,可修改)
    8. func AddDefaultConfigGroup(nodes ConfigGroup)
    9. // 设置默认的分组名称,获取默认数据库对象时将会自动读取该分组配置
    10. func SetDefaultGroup(groupName string)
    11. // 设置数据库配置为定义的配置信息,会将原有配置覆盖
    12. func SetConfig(c Config)

    默认分组表示,如果获取数据库对象时不指定配置分组名称,那么gdb默认读取的配置分组。例如:gdb.New()可获取一个默认分组的数据库对象。

    简单的做法,我们可以通过gdb包的SetConfig配置管理方法进行自定义的数据库全局配置,例如:

    1. gdb.SetConfig(gdb.Config {
    2. "default" : gdb.ConfigGroup {
    3. gdb.ConfigNode {
    4. Host : "192.168.1.100",
    5. Port : "3306",
    6. User : "root",
    7. Pass : "123456",
    8. Name : "test",
    9. Type : "mysql",
    10. Role : "master",
    11. Weight : 100,
    12. },
    13. gdb.ConfigNode {
    14. Host : "192.168.1.101",
    15. Port : "3306",
    16. User : "root",
    17. Pass : "123456",
    18. Name : "test",
    19. Type : "mysql",
    20. Role : "slave",
    21. Weight : 100,
    22. },
    23. },
    24. "user-center" : gdb.ConfigGroup {
    25. gdb.ConfigNode {
    26. Host : "192.168.1.110",
    27. Port : "3306",
    28. User : "root",
    29. Pass : "123456",
    30. Name : "test",
    31. Type : "mysql",
    32. Role : "master",
    33. Weight : 100,
    34. },
    35. },
    36. })

    随后,我们可以使用gdb.New("数据库分组名称")来获取一个数据库操作对象。该对象用于后续的数据库一系列方法/链式操作。