gorm的功能很强大,支持很多很多特性,打算在项目中用上它。

但gorm不支持protobuf,如果idl用的是protobuf,需要对每个message做一个重新定义一个内部的struct,使得可以让这个内部struct和mysql一一对应,这个是个很无脑的搬砖活;而且,对于message里面有内嵌message的情况的,原生的gorm只能做表关联,这对某些表需要比较多的内嵌数据,比如repeated数据,会使得表的记录数出现膨胀增长。因此,让gorm支持protobuf的内嵌字段,而且不需要写中间的struct模型,是非常有必要的。

我主要从几个文件上修改:

1、model_struct.go,这个文件主要是解析struct字段到mysql字段的,对于pb生成的go文件,每个message默认都会生成类似XXX_格式的几个字段,这几个跟业务无关,不需要db,因此直接忽略掉,在GetModelStruct中修改。

2、callback_create.go:这个文件是插入数据的回调,在这里主要是要对pb中的内嵌字段进行序列化,在createCallback中,简单判断字段是ptr就进行序列化。这里有个问题要需要验证:mysql执行插入操作,如果字段是二进制的,可以直接insert into tables(..) values(..)吗

3、dialect_mysql.go:mysql的字段定义,主要改判断字段是ptr的时候,就定义为longblob类型

4、scope.go:从数据库中检索数据用,需要对内嵌字段反序列化,这里需要先了解下sql.rows.scan的操作作用,scan之后需要对字段重新赋值,对于内嵌字段,需要反序列化,在scan中改。这个文件的另一个改动是创建表结构,在createTable中,只对isNormal,也就是普通字段进行创建,其他字段不创建,这里改下。

经过改造后,基本可以支持protobuf了,今天来不及上代码了,改天整理下,看看能否作为一个插件提交给gorm。

修改gorm支持protobuf的更多相关文章

  1. jquery.ui.accordion的修改(支持展开多个)

    原文:jquery.ui.accordion的修改(支持展开多个) 背景:原jquery.ui.accordion插件,最多只能展开一个,不能展开多个,后来在网上找到了一个基于它的一个修改版(http ...

  2. 阅读DSSS.py 并修改成支持python3.6

    项目地址:https://github.com/stamparm/DSSS 功能:一款小型注入工具 代码如下URL:https://github.com/stamparm/DSSS/blob/mast ...

  3. 修改现有消息类让.net core项目支持Protobuf - 【无需使用 [ProtoBuf.ProtoContract] 的方法】

    前言 第二次发博客,希望大家多多鼓励!!! 又接无上老板的一个需求,需要让.net core消息发送端跟消息接收端通信的消息是protobuf格式的(基于protobuf比json小一倍数据量,独特的 ...

  4. TarsGo新版本发布,支持protobuf,zipkin和自定义插件

    本文作者:陈明杰(sandyskies) Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,目前支持C++,Java,PHP,Nodejs,Golang语言.该框架为用户提供了涉及 ...

  5. dhtmlgrid修改,支持IE10

    因为项目IE升级,导致原来使用的dhtmlgrid无法正常显示,同时通过loadxml接口还有属性不支持. 花了半天时间对dhtmlgrid进行了修改,能够支持IE10正常加载显示. edit by ...

  6. 修改LVDS支持1024*600分辨率

    一.在boot中增加LVDS设置分辨率1024*600选项 1.修改文件TQIMX6_android-4.2.2\bootable\bootloader\uboot-imx\common\cmd_me ...

  7. 修改create-react-app支持多入口

    使用Facebook官方脚手架create-react-app创建React应用,默认只能生成一个SPA,入口是index.html.虽然,SPA的页面切换可以使用前台路由框架方便(比如React-R ...

  8. centos 7修改系统支持中文编码

    2019-03-14 查看系统现支持编码 }[root@web dc2-user]#locale LANG=en_US.UTF- LC_CTYPE="en_US.UTF-8" LC ...

  9. 修改live555支持mpeg2ts RTSP拉流,附代码

    在很早之前的博客<用EasyDarwin进行IPTV rtsp mpeg-ts smil流的转发和分发直播服务>中,我们介绍到如何将live555支持mpeg2ts拉流,这个在IPTV领域 ...

随机推荐

  1. python函数初体验

    函数 函数参数w 形式参数>>>>(被指定具体的值)默认参数, 实际参数是调用时候的实际指定参数 我们把函数⾥⾯的参数叫形式函数,函数实际调⽤的时候,赋予的参数叫实际函数 定义 ...

  2. c#跳转

    Response.Redirect(EditUrl("MEUID", lblMEUID.Text, "Page2", "PageOneMK" ...

  3. 中小型企业SaaS行业将崛起于新十年

    2020开始的新十年,国内中小型企业SaaS市场将迎来蓬勃生机,四大助推器已经就绪 第一,云服务打好底座: 随着阿里云.腾讯云乃至华为云的蓬勃发展,基础设施的不断完善,为中小型Saas企业的发展,提供 ...

  4. 使用Rapidxml重建xml树

    需求 : 重建一棵xml树, 在重建过程中对原来的标签进行一定的修改. 具体修改部分就不给出了, 这里只提供重建部分的代码 code : /****************************** ...

  5. Linux shell实现每天定时备份mysql数据库

    每天定时备份mysql数据库任务,删除指定天数前的数据,保留指定天的数据: 需求: 1,每天4点备份mysql数据: 2,为节省空间,删除超过3个月的所有备份数据: 3,删除超过7天的备份数据,保留3 ...

  6. 【科研】科研【合同】盖章流程/横向&#183;非涉密/电子科技大学

    [前置手续] 一.在科研管理系统里填单子,立项. 二.科研管理系统审核通过后,对于对面给好的合同,在合同系统里选择[合同业务发起-发起非标准合同],填单子. 三.会有一系列的审核,审核完成后打印合同备 ...

  7. 莫烦python教程学习笔记——利用交叉验证计算模型得分、选择模型参数

    # View more python learning tutorial on my Youtube and Youku channel!!! # Youtube video tutorial: ht ...

  8. Mysql资料 锁机制

    目录 一.简介 二.类型 三.操作 四.死锁 第一种情况 第二种情况 第三种情况 一.简介 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同 ...

  9. 什么是git?

    目录 一.简介 Git与SVN 区别 一.简介 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核 ...

  10. Xpath 使用技巧

    使用xpath 简介 常见语法 选取节点 谓语 通配符 选取多个路径 运算符 其他用法 使用contains选取包含属性 使用tostring()将对象转换为字符串 使用starts-with 使用n ...