数据结构

  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,pgsql)
  11. Role string // (可选,默认为master)数据库的角色,用于主从操作分离,至少需要有一个master,参数值:master, slave
  12. Charset string // (可选,默认为 utf-8)编码,默认为 utf-8
  13. Priority int // (可选)用于负载均衡的权重计算,当集群中只有一个节点时,权重没有任何意义
  14. Linkinfo string // (可选)自定义链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效(该字段是一个扩展功能,参考sql.Open参数)
  15. }

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

配置管理特点:

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

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

(推荐)配置文件

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

如果我们使用对象管理包中的g.Database()/g.DB()方法获取数据库操作对象(g.DB()g.Database()的别名方法),那么数据库配置可以在全局配置文件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. charset = "数据库编码(如: utf8/gbk/gb2312),一般设置为utf8"
  11. priority = "优先级,用于负载均衡控制,不使用应用层的负载均衡机制请均设置为1"

一个数据库配置项示例:

  1. [database]
  2. [[database.default]]
  3. host = "127.0.0.1"
  4. port = "3306"
  5. user = "root"
  6. pass = ""
  7. name = "test"
  8. type = "mysql"
  9. role = "master"
  10. charset = "utf8"
  11. priority = "1"

随后,我们可以通过g.Database("数据库分组名称")/g.DB("数据库分组名称")来获取一个数据库操作对象,对象管理器会自动读取并解析配置文件中的数据库配置信息,并生成对应的数据库对象,非常简便。

配置方法

这是原生调用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. Priority : 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. Priority : 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. Priority : 100,
  34. },
  35. },
  36. })

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