一、背景

  在业务场景开发的过程中, 随着数据量的增加,相同表结构不同表名的分表策略是常用的方案选择之一。如下以golang做为后端业务开发,尝试修改beego的orm库做一个相同表结构不同表名的分表实现。

二、orm相同表结构不同表名的修改逻辑

三、orm分表对比

不分表代码使用 分表代码使用

o := orm.NewOrm()
user := User{Name: "slene"}
// insert
id, err := o.Insert(&user)
o := orm.NewOrm()
user := User{Name: "slene"} // set table name to `user_1`
o.ShardingTable(
func(tableName string) string {
return tableName + "_1"
},
) // insert
id, err := o.Insert(&user)

o := orm.NewOrm()
user := User{Name: "slene"} // update
user.Name = "astaxie"
num, err := o.Update(&user)

  

o := orm.NewOrm()
user := User{Name: "slene"} // set table name to `user_1`
o.ShardingTable(
func(tableName string) string {
return tableName + "_1"
},
) // update
user.Name = "astaxie"
num, err := o.Update(&user)

  

o := orm.NewOrm()
user := User{id: 1} // select
o.QueryTable(user).One(&user)
o := orm.NewOrm()
user := User{id: 1} // set table name to `user_1`
o.ShardingTable(
func(tableName string) string {
return tableName + "_1"
},
) // select
o.QueryTable(user).Offset(offset).Limit(limit).One(&user) // select id, name from user_1 where id=1 limit 0,1

o := orm.NewOrm()
user := User{id: 1} // delete
o.Delete(user) // delete from user_1 where id=1
o := orm.NewOrm()
user := User{id: 1} // set table name to `user_1`
o.ShardingTable(
func(tableName string) string {
return tableName + "_1"
},
) // delete
o.Delete(user) // delete from user_1 where id=1

从如上的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实现相同表结构不同表名的分表方法实现的更多相关文章

  1. MySQL复制表结构和内容到另一个表中

    一:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已经支持了)1.复制表结构到新表CREATE TABLE 新表LIKE 旧表 2.复制旧表的数据到新表(假设两个表结构一样) ...

  2. mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  3. ShardingJdbc-分表;分库;分库分表;读写分离;一主多从+分表;一主多从+分库分表;公共表;数据脱敏;分布式事务

    目录 创建项目 分表 导包 表结构 Yml 分库 Yml Java 分库分表 数据库 Yml 读写分离 数据库 Yml 其他 只请求主库 读写分离判断逻辑代码 一主多从+分表 Yml 一主多从+分库分 ...

  4. phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建

    phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建 场景:当前有一张表:Ntime,因为表太大了,考虑要分表: Ntime2017 Nti ...

  5. 分库分表(5) ---SpringBoot + ShardingSphere 实现分库分表

    分库分表(5)--- ShardingSphere实现分库分表 有关分库分表前面写了四篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3. ...

  6. 分库分表(7)--- SpringBoot+ShardingSphere实现分库分表 + 读写分离

    分库分表(7)--- ShardingSphere实现分库分表+读写分离 有关分库分表前面写了六篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理 ...

  7. 基于beego orm 针对oracle定制

    目前golang的ORM对oracle支持都没有mysql那样完整,一个orm要同时兼容mysql和oracle由于在sql语法上区别,会使整orm变的非常臃肿. 本项目是在beego orm上修改, ...

  8. 4 hbase表结构 + hbase集群架构及表存储机制

      本博文的主要内容有    .hbase读取数据过程 .HBase表结构 .附带PPT http://hbase.apache.org/ 读写的时候,就需要用hbase了,换句话说,就是读写的时候. ...

  9. Mysql学习—查看表结构、修改和删除数据表

    原文出自:http://blog.csdn.net/junjieguo/article/details/7668775 查看表结构 查看表结构可以用语句DESCRIBE或SHOW CREATE TAB ...

随机推荐

  1. Serverless 在编程教育中的实践

    说起Serverless这个词,我想大家应该都不陌生,那么Serverless这个词到底是什么意思?Serverless到底能解决什么问题?可能很多朋友还没有深刻的体会和体感,这篇文章我就和大家一起聊 ...

  2. 初步认识HCIA,什么是计算机网络,拓扑,网络的发展,交换机,路由器,IP,光纤,带宽,广播,ARP......

    HCIA ---- 华为认证初级网络工程师 云技术 --- 云存储 云计算 计算机技术 : ​ --- 抽象语言 -- 电线号的转换 抽象语言 -- 编码 ---- 应用层 编码 --- 二进制 -- ...

  3. 题解 Wide Swap

    题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \tex ...

  4. Windows使用Git的vim编辑器编译运行程序

    Windows配置gcc 新建一个main.c $ touch main.c #在当前目录下创建main.c $ mkdir folder #在当前目录下创建folder文件夹 $ rm main.c ...

  5. DM8数据库单机安装

    一.系统概要 表1 部署情况一览表 操作系统 Windows10 数据库版本 DM8(开发版) 数据库类型 单机 磁盘挂载 无 Key信息 无 二.操作系统信息检查 2.1 操作系统版本 [root@ ...

  6. 【c++ Prime 学习笔记】第4章 表达式

    表达式由一个或多个运算对象组成,对表达式求值返回结果. 字面值和变量是最简单的表达式 把运算符和运算对象组合可得到复杂表达式. 4.1 基础 4.1.1 基本概念 一元运算符作用于一个对象,如取地址符 ...

  7. 这12种场景Spring事务会失效!

    前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了.在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性 (要么同时成功,要么同时失败),避免数据 ...

  8. SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目

    如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...

  9. stm32驱动超声波模块

    下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发. #define HCSR04_PORT GPIOB #define HCSR04_CLK RCC ...

  10. IM服务器:我的千万级在线聊天服务器集群

    一.服务器特点 01.傻瓜式部署,一键式启动: 02.单机支持10万以上在线用户聊天(8G内存,如果内存足够大,并发量可超过10万): 03.支持服务器集群,集群间高内聚.低耦合,可动态横向扩展IM服 ...