修改gorm支持protobuf

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。

原文地址:https://www.cnblogs.com/mixerzhan/p/9716579.html

时间: 2024-11-09 02:49:35

修改gorm支持protobuf的相关文章

修改LVDS支持1024*600分辨率

一.在boot中增加LVDS设置分辨率1024*600选项 1.修改文件TQIMX6_android-4.2.2\bootable\bootloader\uboot-imx\common\cmd_menu.c文件 在函数lcd_menu_shell中添加: 1 case '2': 2 do 3 { 4 printf("\r\n##### display select LVDS #####\r\n"); 5 printf("[1] 800*600 for LVDS->VG

spring mvc 4.1支持protobuf converters

最近公司有个项目需要和c++做信息交换,现在流行比较流行http+protobuf方式,一是比较简单学习成本低,二是信息的压缩比例比较好,节省带宽. 经过调研spring 4.1以后开始支持protobuf HttpMessageConverter 详细的配置如下: pom.xml配置: <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</arti

wamp中修改配置支持多站点

本文介绍如果在wamp中修改配置支持多站点. 第1步,修改httpd.conf,增加8080端口的监听 #Listen 12.34.56.78:80Listen 80Listen 8080 第2步,修改virtual hosts的配置,同样在httpd.conf这个文件中. # Virtual hosts #Include conf/extra/httpd-vhosts.conf #修改为 # Virtual hosts Include conf/extra/httpd-vhosts.conf

修改linux支持中文显示!

安装中文支持包后 编辑  /etc/sysconfig/i18n 将内容改为LANG="zh_CN.UTF-8"SYSFONT="latarcyrheb-sun16"SUPPORTED="zh_CN.UTF-8:zh_CN:zh" 修改linux支持中文显示!

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

前言 第二次发博客,希望大家多多鼓励!!! 又接无上老板的一个需求,需要让.net core消息发送端跟消息接收端通信的消息是protobuf格式的(基于protobuf比json小一倍数据量,独特的编码.没有fieldname等),但现有项目的消息类数量巨多,按照网上的方案是安装protobuf.net 这个nuget包,然后需要给消息类一个一个添加[ProtoBuf.ProtoContract].[ProtoBuf.ProtoMember(index)]等Attributes,更可悲的是,还

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

本文作者:陈明杰(sandyskies)Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,目前支持C++,Java,PHP,Nodejs,Golang语言.该框架为用户提供了涉及到开发.运维.以及测试的一整套解决方案,帮助一个产品或者服务快速开发.部署.测试.上线. 它集可扩展协议编解码.高性能RPC通信框架.名字路由与发现.发布监控.日志统计.配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理.目前该框架在腾讯内部,各大核

codeingiter修改版本支持多module

最近刚入职一家公司发现该公司采用的框架是古老的CI1.7.2加matchbox扩展而来的遂研究一翻 发现直接在其中进行升级有些麻烦索性修改新发布的CI3.0 为多module支持 现贡献给大家使用 此版本是在CI3.0版本的基础上修改开发出来的 此版本的框架对CI3.0进行了HMVC扩展 此扩展主要通过 EX_Loader.php文件进行扩展 简要说明如下: 1.application下为应用目录 2.common为公共文件夹 其中可以存放公共配置文件,核心文件,帮助文件,hooks, lang

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

在很早之前的博客<用EasyDarwin进行IPTV rtsp mpeg-ts smil流的转发和分发直播服务>中,我们介绍到如何将live555支持mpeg2ts拉流,这个在IPTV领域用的特别多,其实修改的点也不是很多,主要是要对live555有一点的熟悉程度,这里就不多显摆啥了,直接上之前的说明和代码: live555直接请求IPTV RTSP时,IPTV服务器返回给客户端的sdp信息中的m=字段,这个媒体类型live555是无法识别的,也就是MP2T(mpeg2-ts)流,从抓包来看,

修改windows支持的远程桌面最大用户数

开始->管理工具->远程桌面服务->远程桌面会话主机配置->限制每个用户只能进行一次会话 "计算机配置"---"管理模板"---"windows组件"----"远程桌面服务"----"远程桌面会话主机"---"连接",最后选择"限制连接数量" 在"限制连接的数量"属性卡里,点击"已启用",并在"