【Golang】基于beego/orm实现相同表结构不同表名的分表方法实现
一、背景
在业务场景开发的过程中, 随着数据量的增加,相同表结构不同表名的分表策略是常用的方案选择之一。如下以golang做为后端业务开发,尝试修改beego的orm库做一个相同表结构不同表名的分表实现。
二、orm相同表结构不同表名的修改逻辑
三、orm分表对比
操 作 |
不分表代码使用 | 分表代码使用 |
写 入 |
o := orm.NewOrm() |
o := orm.NewOrm() |
更 新 |
o := orm.NewOrm()
|
o := orm.NewOrm()
|
查 询 |
o := orm.NewOrm() |
o := orm.NewOrm() |
删 除 |
o := orm.NewOrm() |
o := orm.NewOrm() |
从如上的CURD中,我们可以看到如下一段实时修改表名的代码
// set table name to `user_1`
o.ShardingTable(
func(tableName string) string {
return tableName + "_1"
},
)
我们一步步分析一下orm是如何实现表名的实时修改。
四、分表实现分析
4.1 修改代码文件:https://github.com/gityf/orm/blob/master/orm/types.go
// Ormer define the orm interface
type Ormer interface {
// ...
// set sharding table in time for different table name with same struct.
// ormer.ShardingTable(
// func(tableName string) string {
// return tableName + "_" + tableNameSuffix
// },
// )
ShardingTable(func(string) string)
}
修改types.go的Ormer接口,增加分表的函数,参数是一个获取分表的函数,即每一个分表的表名的设置是一个orm实例。通过orm.NewOrm()创建。
4.2 修改代码文件:https://github.com/gityf/orm/blob/master/orm/orm.go
修改orm.go文件,给结构orm增加如下两个分表相关的函数
type orm struct {
alias *alias
db dbQuerier
isTx bool
sharding func(string) string
shardingTable func(string) string
}
有了如上的sharding函数,我们只要在创建orm时,实时的设置这个sharding函数,通过函数获取新表名。
在函数NewOrm中给新创建的
o := new(orm)
设置一个分表函数如下
// switch to another registered database driver by given name.
func (o *orm) Using(name string) error {
// ...
if al, ok := dataBaseCache.get(name); ok {
o.sharding = func(table string) string {
if o.shardingTable == nil {
return table
}
return o.shardingTable(table)
}
}
// ...
}
orm结构体有了分表函数的设置,我们需要给orm的成员dbQuerier增加分表函数如下
o.db = &DB{
RWMutex: al.DB.RWMutex,
DB: al.DB.DB,
stmtDecorators: al.DB.stmtDecorators,
sharding: o.sharding,
}
4.3 修改代码文件:https://github.com/gityf/orm/blob/master/orm/db_alias.go
DB是dbQuerier接口的一个实现,对DB结构体的实现增加分表函数
func (d *DB) Sharding(table string) string {
return d.sharding(table)
}
4.4 修改代码文件:https://github.com/gityf/orm/blob/master/orm/db.go
对db代码文件中的dbBase的CURD中的sql生成时,增加如下实时修改表名的实现 q.Sharding(mi.table)
// create insert sql preparation statement object.
func (d *dbBase) PrepareInsert(q dbQuerier, mi *modelInfo) (stmtQuerier, string, error) {
Q := d.ins.TableQuote()
// ...
query := fmt.Sprintf("INSERT INTO %s%s%s (%s%s%s) VALUES (%s)", Q, q.Sharding(mi.table), Q, Q, columns, Q, qmarks)
// ...
}
其他的orm转sql的通过dbQuerier的q.Sharding(mi.table)获取表名
增加orm相同表结果不同表名的代码实现:https://github.com/gityf/orm
祝玩的开心~
【Golang】基于beego/orm实现相同表结构不同表名的分表方法实现的更多相关文章
- MySQL复制表结构和内容到另一个表中
一:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已经支持了)1.复制表结构到新表CREATE TABLE 新表LIKE 旧表 2.复制旧表的数据到新表(假设两个表结构一样) ...
- mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表
之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...
- ShardingJdbc-分表;分库;分库分表;读写分离;一主多从+分表;一主多从+分库分表;公共表;数据脱敏;分布式事务
目录 创建项目 分表 导包 表结构 Yml 分库 Yml Java 分库分表 数据库 Yml 读写分离 数据库 Yml 其他 只请求主库 读写分离判断逻辑代码 一主多从+分表 Yml 一主多从+分库分 ...
- phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建
phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建 场景:当前有一张表:Ntime,因为表太大了,考虑要分表: Ntime2017 Nti ...
- 分库分表(5) ---SpringBoot + ShardingSphere 实现分库分表
分库分表(5)--- ShardingSphere实现分库分表 有关分库分表前面写了四篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3. ...
- 分库分表(7)--- SpringBoot+ShardingSphere实现分库分表 + 读写分离
分库分表(7)--- ShardingSphere实现分库分表+读写分离 有关分库分表前面写了六篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理 ...
- 基于beego orm 针对oracle定制
目前golang的ORM对oracle支持都没有mysql那样完整,一个orm要同时兼容mysql和oracle由于在sql语法上区别,会使整orm变的非常臃肿. 本项目是在beego orm上修改, ...
- 4 hbase表结构 + hbase集群架构及表存储机制
本博文的主要内容有 .hbase读取数据过程 .HBase表结构 .附带PPT http://hbase.apache.org/ 读写的时候,就需要用hbase了,换句话说,就是读写的时候. ...
- Mysql学习—查看表结构、修改和删除数据表
原文出自:http://blog.csdn.net/junjieguo/article/details/7668775 查看表结构 查看表结构可以用语句DESCRIBE或SHOW CREATE TAB ...
随机推荐
- gin 集成 consul
"github.com/hashicorp/consul/api" package initialize import ( "fmt" "github ...
- 洛谷3648 [APIO2014]序列分割(斜率优化+dp)
首先对于这个题目. qwq 存在一个性质就是,最终的答案只跟你的分割的位置有关,而和顺序无关. 举一个小栗子 \(a\ b\ c\) 将这个东西分成两块. 如果我们先分割\(ab\)之间的话,\(an ...
- 洛谷4035 JSOI2008球形空间产生器 (列柿子+高斯消元)
题目链接 qwq 首先看到这个题,感觉就应该从列方程入手. 我们设给定的点的坐标矩阵是\(x\),然后球心坐标\(a_1,a_2....a_n\) 根据欧几里得距离公式,对于一个\(n维空间\)的第\ ...
- hibernate不同条件查询结果集一样,主键@ID的原因
这一周在翻新公司的老项目,遇到了一些预想不到的事情. 其中一个是,使用hibernate查询,不同的查询条件,居然都查到同一条记录,感觉奇怪了,开始以为是session的原因: 后来发现是hibern ...
- Java多线程编程实战指南 核心篇 读书笔记
锁 volatile CAS final static 原子性保障 具备 具备 具备 不涉及 不涉及 可见性保障 具备 具备 不具备 不具备 具备① 有序性保证 具备 具备 不涉及 具备 具备② 上下 ...
- 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功
苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 这是苹果wwdc2021 推出的新功能 参考官网链接 App Store Server API | Apple Deve ...
- NX开发 刀路生成
此段是可以生成程序的完整代码,只有从坐标(10,10,10)到(500,500,500)一根刀轨.motion_ptr->feed_value 的值为0时生成G00,非0时生成G01.此代码只有 ...
- 实现服务器和客户端数据交互,Java Socket有妙招
摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...
- 欧姆龙PLC HostLink协议整理
欧姆龙PLC HostLink协议整理 1.常用的存储器功能区 CIO: 输入继电器 272 点(17 CH) 0.00-16.15 输出继电器 272 点(17 CH) 100.00-116.1 ...
- 2020BUAA软工热身作业
2020BUAA软工热身作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 热身作业 我在这个课程的目标是 学习软件工 ...