我们知道数据库的配置中有支持对默认数据库的配置,因此DB
对象及Model
对象在初始化的时候已经绑定到了特定的数据库上。运行时切换数据库有几种方案(假如我们的数据库有user
用户数据库和order
订单数据库):
- 通过不同的配置分组来实现。这需要在配置文件中配置不同的分组配置,随后在程序中可以通过
g.DB("分组名称")
来获取特定数据库的单例对象。 通过运行时
DB.SetSchema
方法切换单例对象的数据库,需要注意的是由于修改的是单例对象的数据库配置,因此影响是全局的:g.DB().SetSchema("user-schema") g.DB().SetSchema("order-schema")
通过链式操作
Schema
方法创建Schema
数据库对象,并通过该数据库对象创建模型对象并执行后续链式操作:g.DB().Schema("user-schema").Model("user").All() g.DB().Schema("order-schema").Model("order").All()
也可以通过链式操作
Model.Schema
方法设置当前链式操作对应的数据库,没有设置的情况下使用的是其DB
或者TX
默认连接的数据库:g.Model("user").Schema("user-schema").All() g.Model("order").Schema("order-schema").All()
注意两种使用方式的差别,前一种方式来自于
Schema
对象创建Model
对象后执行操作;后一种方式是通过修改当前Model
对象操作的数据库名称达到切换数据库的目的。此外,假如当前数据库操作配置的用户有权限,那么可以直接通过表名中带数据库名称实现跨域操作,甚至跨域关联查询:
// SELECT * FROM `order`.`order` o LEFT JOIN `user`.`user` u ON (o.uid=u.id) WHERE u.id=1 LIMIT 1 g.Model("order.order o").LeftJoin("user.user u", "o.uid=u.id").Where("u.id", 1).One()
7 Comments
扶程星云
Ray
Schema 填的是数据库名 ,同盟数据库怎么办呢
shawn_hou
同问:这里的数据库切换,对于mysql来说,设置Schema是切换database,但对于postgresql来说,看上去是切换Schema,但是其实也是切换database,那么对于postgresql,schema是归属于database的,那么这里如果想切换schema而不是切换数据库应该如何实现呢? 比如我有个数据库test,下面有很多个schema,我需要动态切换schema
海亮
ORM使用配置 - GoFrame (ZH)-Latest - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架
namespace参数
shawn_hou
谢谢回复,我了解到这个namespace的配置参数,但是尝试过后发现,目前存在以下问题:
连接中的方式满足不了我的需求,我阅读了源码进行了修改。
目前涉及的改造有:
糖水不加糖
直接去提PR
shawn_hou
等我测试好了再提交pr吧,还在改造测试中。