当前位置: 首页 > article >正文

go gorm极简元数据处理

func Test003_GetDbMeta(t *testing.T) { var dbfacade FindBeanDbmetaFacade() ret : dbfacade.GetDbMeta(plat_menu) golog.Info(dbmeta:, ret) }2026-03-15 13:42:01.939 [INFO] dbmeta: { code: 200, msg: 成功, exist: true, data: { tableExist: false, tableType: , tableSchema: , tableName: plat_menu, indexName: , fieldsName: , columns: [ { goType: int64, tableName: plat_menu, tableSchema: , columnName: id, dbTypeName: int8, primaryKey: true, autoIncrement: true, nullable: false, unique: false, columnType: bigint, length: 64, comment: , defaultValue: , decimalSize: { Precision: 64, Scale: 0 } }, { goType: string, tableName: plat_menu, tableSchema: , columnName: menu_code, dbTypeName: varchar, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: character varying, length: -5, comment: , defaultValue: , decimalSize: { Precision: 0, Scale: 0 } }, { goType: string, tableName: plat_menu, tableSchema: , columnName: menu_name, dbTypeName: varchar, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: character varying, length: -5, comment: , defaultValue: , decimalSize: { Precision: 0, Scale: 0 } }, { goType: string, tableName: plat_menu, tableSchema: , columnName: list_order, dbTypeName: varchar, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: character varying, length: -5, comment: , defaultValue: , decimalSize: { Precision: 0, Scale: 0 } }, { goType: int64, tableName: plat_menu, tableSchema: , columnName: created_by, dbTypeName: int8, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: bigint, length: 64, comment: , defaultValue: 1, decimalSize: { Precision: 64, Scale: 0 } }, { goType: time.Time, tableName: plat_menu, tableSchema: , columnName: created_at, dbTypeName: timestamptz, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: timestamp with time zone, length: 64, comment: , defaultValue: , decimalSize: { Precision: 6, Scale: 0 } }, { goType: bool, tableName: plat_menu, tableSchema: , columnName: active, dbTypeName: bool, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: boolean, length: 8, comment: , defaultValue: true, decimalSize: { Precision: 0, Scale: 0 } }, { goType: bool, tableName: plat_menu, tableSchema: , columnName: visible, dbTypeName: bool, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: boolean, length: 8, comment: , defaultValue: true, decimalSize: { Precision: 0, Scale: 0 } }, { goType: string, tableName: plat_menu, tableSchema: , columnName: subsys, dbTypeName: varchar, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: character varying, length: -5, comment: , defaultValue: opc, decimalSize: { Precision: 0, Scale: 0 } }, { goType: int64, tableName: plat_menu, tableSchema: , columnName: parent_id, dbTypeName: int8, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: bigint, length: 64, comment: 父节点, defaultValue: -1, decimalSize: { Precision: 64, Scale: 0 } }, { goType: int32, tableName: plat_menu, tableSchema: , columnName: page_type, dbTypeName: int4, primaryKey: false, autoIncrement: false, nullable: true, unique: false, columnType: integer, length: 32, comment: 页面组件类型10 菜单 20按扭, defaultValue: 10, decimalSize: { Precision: 32, Scale: 0 } } ], pkInfo: [ { goType: int64, tableName: plat_menu, tableSchema: , columnName: id, dbTypeName: int8, primaryKey: true, autoIncrement: true, nullable: false, unique: false, columnType: bigint, length: 64, comment: , defaultValue: , decimalSize: { Precision: 64, Scale: 0 } } ] }, total: 0, pageSize: 0, pageCurrent: 0 } 代码package dbmeta import ( gitee.com/leijmdas/goweb3/goconfig/base/basedto gitee.com/leijmdas/goweb3/goconfig/dbcontent gitee.com/leijmdas/goweb3/goconfig/ichublog/golog gitee.com/leijmdas/goweb3/goweb/pagemodel _ gorm.io/driver/mysql _ gorm.io/driver/postgres gorm.io/gorm gorm.io/gorm/schema ) type DbmetaFacade struct { basedto.BaseEntitySingle Dbtables } func NewDbmetaFacade() *DbmetaFacade { return DbmetaFacade{} } type Dbtables struct { basedto.BaseEntitySingle TableList []string json:tableList ColumnsMap map[string][]gorm.ColumnType json:columnsMap Columns []gorm.ColumnType json:columns TableName string json:tableName } func NewDbtables() *Dbtables { return Dbtables{} } func (self *DbmetaFacade) Init() { if self.ColumnsMap nil { self.ColumnsMap make(map[string][]gorm.ColumnType) } if self.Columns nil { self.Columns make([]gorm.ColumnType, 0) } } func (self *DbmetaFacade) GetDbTable(table any) (err error) { self.TableList, err self.GetTables() if err ! nil { return err } self.Columns, err self.ColumnTypes(table) return nil } func (self *DbmetaFacade) GetDbTables() (err error) { var dbs dbcontent.GetDB().Migrator().CurrentDatabase() golog.Error(dbs) self.TableList, err self.GetTables() if err ! nil { return err } self.Init() for i : range self.TableList { var columns, err self.ColumnTypes(self.TableList[i]) if err ! nil { return err } self.ColumnsMap[self.TableList[i]] columns } return err } func (self *DbmetaFacade) GetTables() ([]string, error) { tableList, err : dbcontent.GetDB().Migrator().GetTables() return tableList, err } func (self *DbmetaFacade) ColumnTypes(dst any) ([]gorm.ColumnType, error) { columnTypes, err : dbcontent.GetDB().Migrator().ColumnTypes(dst) return columnTypes, err } func (self *DbmetaFacade) GetDbMeta(paramTable any) *pagemodel.IchubResult[*DbmetaTable] { var table FindBeanDbmetaTable() //if tab, err : self.GetTables(); err ! nil { // golog.Error(err,tab) // return pagemodel.ResultErrData(tables, err) //} if tab, ok : paramTable.(string); ok { table.TableName tab } else if tab, ok : paramTable.(schema.Tabler); ok { table.TableName tab.TableName() } var columns, err self.ColumnTypes(paramTable) if err ! nil { golog.Error(err, columns) return pagemodel.ResultErrData(table, err) } for _, column : range columns { var dbcol FindBeanDbmetaColumn() dbcol.TableName table.TableName dbcol.FromColumnType(column) if dbcol.PrimaryKey { table.PkColumns append(table.PkColumns, dbcol) } table.Columns append(table.Columns, dbcol) } return pagemodel.ResultOk(table, true) }package dbmeta import ( gitee.com/leijmdas/goweb3/goconfig/base/baseiface gitee.com/leijmdas/goweb3/goconfig/basedi github.com/sirupsen/logrus ) /* Title 文件名称: dbmeta_column_init.go Desp 描述: 依赖自动注入 Company 公司: www.ichub.com Author 作者: leijmdas163.com 时间: 2026-03-15 12:51:06 Update 作者: leijmdas163.com 时间: 2026-03-15 12:51:06 */ var singleNameDbmetaColumn *dbmeta.DbmetaColumn-9d032f30-4763-45a5-9c04-1a27902a7995 // init register load func init() { registerBeanDbmetaColumn() } // register DbmetaColumn func registerBeanDbmetaColumn() { err : basedi.RegisterLoadBean(singleNameDbmetaColumn, LoadDbmetaColumn) if err ! nil{ logrus.Error(register bean error!, err) } } // FindBeanDbmetaColumn func FindBeanDbmetaColumn() *DbmetaColumn { if bean, ok : basedi.FindBeanOk(singleNameDbmetaColumn); ok { return bean.(*DbmetaColumn) } logrus.Error(not find bean!) return nil } func LoadDbmetaColumn() baseiface.ISingleton { var inst NewDbmetaColumn() InjectDbmetaColumn(inst) return inst } func InjectDbmetaColumn(s *DbmetaColumn) { }package dbmeta import ( strings gitee.com/leijmdas/goweb3/goconfig/base/basedto gitee.com/leijmdas/goweb3/goconfig/base/stringutils github.com/samber/lo ) type DbmetaTable struct { basedto.BaseEntity TableExist bool json:tableExist TableType string json:tableType TableSchema string json:tableSchema gorm:column:table_schema TableName string json:tableName gorm:column:table_name IndexName string json:indexName FieldsName string json:fieldsName Columns []*DbmetaColumn json:columns PkColumns []*DbmetaColumn json:pkInfo } func NewDbmetaTable() *DbmetaTable { var metaTable DbmetaTable{ PkColumns: make([]*DbmetaColumn, 0), Columns: make([]*DbmetaColumn, 0), } metaTable.InitProxy(metaTable) return metaTable } func (self *DbmetaTable) IfPkColumnExists() bool { return self.PkColumns ! nil len(self.PkColumns) 0 } func (self *DbmetaTable) IfView() bool { return self.TableType VIEW } func (self *DbmetaTable) IfFieldNameExists() bool { return self.FieldsName ! } func (self *DbmetaTable) IfFieldExists(field string) bool { var _, ok self.FindColumn(field) return ok } func (self *DbmetaTable) FindColumn(field string) (*DbmetaColumn, bool) { return lo.Find(self.Columns, func(item *DbmetaColumn) bool { return item.ColumnName field }) } func (self *DbmetaTable) ToFieldsName() string { var fields lo.Map(self.Columns, func(item *DbmetaColumn, index int) string { return item.ColumnName }) self.FieldsName strings.Join(fields, ,) return self.FieldsName } func (self *DbmetaTable) FindGoField(propName string) (*DbmetaColumn, bool) { return self.FindColumn(stringutils.Camel2Case(propName)) } func (self *DbmetaTable) FindGoType(propName string) string { var goField, ok self.FindGoField(propName) return lo.Ternary(ok, goField.GoType, string) }package dbmeta import ( gitee.com/leijmdas/goweb3/goconfig/base/basedto github.com/gogf/gf/v2/util/gconv gorm.io/gorm ) type DecimalSize struct { Precision int64 Scale int64 } type DbmetaColumn struct { basedto.BaseEntity GoType string json:goType,gorm:- TableName string json:tableName,gorm:column:table_name TableSchema string json:tableSchema,gorm:column:table_schema ColumnName string json:columnName,gorm:column:column_name DbTypeName string json:dbTypeName,gorm:column:dbTypeName // varchar PrimaryKey bool json:primaryKey,gorm:column:primary_key AutoIncrement bool json:autoIncrement,gorm:column:auto_increment Nullable bool json:nullable,gorm:column:nullable Unique bool json:unique,gorm:column:unique ColumnType string json:columnType,gorm:column:column_type // varchar(64) Length int64 json:length,gorm:column:length Comment string json:comment ,gorm:column:comment DefaultValue string json:defaultValue ,gorm:column:default_value DecimalSize DecimalSize json:decimalSize,gorm:column:decimal_size } func NewDbmetaColumn() *DbmetaColumn { var col DbmetaColumn{} col.InitProxy(col) return col } func (self *DbmetaColumn) FromColumnType(column gorm.ColumnType) *DbmetaColumn { self.ColumnName column.Name() self.GoType gconv.String(column.ScanType()) self.DbTypeName column.DatabaseTypeName() // varchar self.ColumnType, _ column.ColumnType() // varchar(64) self.Length, _ column.Length() self.Comment, _ column.Comment() self.DefaultValue, _ column.DefaultValue() self.DecimalSize.Precision, self.DecimalSize.Scale, _ column.DecimalSize() self.PrimaryKey, _ column.PrimaryKey() self.Nullable, _ column.Nullable() self.Unique, _ column.Unique() self.AutoIncrement, _ column.AutoIncrement() return self }

相关文章:

go gorm极简元数据处理

func Test003_GetDbMeta(t *testing.T) {var dbfacade FindBeanDbmetaFacade()ret : dbfacade.GetDbMeta("plat_menu")golog.Info("dbmeta:", ret) }2026-03-15 13:42:01.939 [INFO] dbmeta: {"code": 200,"msg": "成功",&…...

避坑 3:Docker 致命大坑!容器一删,业务数据全没了?3 套解决方案,直接抄,不翻车

文章目录避坑 3:Docker 致命大坑!容器一删,业务数据全没了?3 套解决方案,直接抄,不翻车方案一:根治方案!命名数据卷持久化(生产 / 测试环境通用,官方首选&…...

社会上有以假乱真的假钞,数学中有以假乱真的假R轴迷惑世人几百年

黄小宁R各元x有对应数2x。R轴即x轴沿本身保序不保距地拉伸变换为元为点2x的2x轴不全等于x轴从而更不x轴,然而自有函数和解析几何概念几百年来数学一直误以为x轴2x轴。将两异直线误为同一线自然就会将两异直线段误为同一线段从而使康脱推出错上加错的更重大错误&…...

WordPress网站营销数据跟踪

如今,在数字营销领域,数据分析已成为优化网站的关键。对于WordPress网站而言,跟踪和分析营销数据不仅有助于提升用户体验,还能提高流量和转化率。许多服务器提供商(如 Hostease)支持一键安装WordPress&…...

Ubuntu 22.04 局域网安装GitLab

下面直接给你一份 Ubuntu 22.04 在局域网安装 GitLab 的可执行教程。 场景固定为: 非 Docker 非源码 服务器 IP:192.168.1.42 安装方式:GitLab Linux package(Omnibus) 先按 HTTP 内网访问 部署,最快跑通;GitLab 官方也明确支持把 external_url 直接设成服务器 IP,只是…...

毕设程序java车险理赔管理系统 基于SpringBoot的车辆保险智能定损与理赔平台 汽车保险全流程数字化管理与在线理赔系统

毕设程序java车险理赔管理系统b8xa28me (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着汽车保有量的持续攀升和交通事故频发,车险理赔作为连接车主权益保障与保险…...

毕设程序java车辆保养管理平台 基于SpringBoot的汽车养护服务系统 智慧车辆维保一体化平台

毕设程序java车辆保养管理平台60q1uywv(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着汽车保有量的持续攀升,车辆后市场服务正经历从传统纸质档案向数字化管理的…...

最近在折腾步科触摸屏和台达VFD-M变频器的通讯项目,实测走通了一套控制方案。先给大伙儿分享下关键配置和脚本实现,手头有设备的可以直接抄作业

步科触摸屏通讯台达vfd-m变频器示例 所需硬件:步科t070或其它支持485功能触摸屏(电脑在线模拟需要USB转485转换头),台达VFD-m变频器。 功能实现:正反转,点动停止,频率设定,运行频率,电流&#x…...

卸灰阀、星型卸料阀、旋转卸料阀cad总装配图纸

卸灰阀、星型卸料阀与旋转卸料阀作为气力输送系统中的核心组件,其设计逻辑与功能定位直接决定了物料的输送效率与系统稳定性。卸灰阀通常安装于储料仓底部,通过阀体开合控制物料下落,其核心作用在于防止仓内气体逆流,避免粉尘外泄…...

Redis 集群从裸奔到全副武装:搭建、可视化、监控、告警、看板一条龙

你的 Redis 集群还在"裸奔"吗?跑着跑着挂了不知道,内存爆了没人管,慢查询堆成山还蒙在鼓里。网上教程要么只讲搭建,要么只讲监控,想找一篇从头到尾串起来的——没有。所以我写了这篇,从 搭建集群…...

【IT老齐245 笔记 + 思考】综合对比九种 MySQL 高可用方案

视频来源:B站 IT老齐 本文为视频学习笔记 扩展整理,覆盖 9 种主流 MySQL 高可用方案的原理、优缺点及选型建议。 一、高可用的核心目标 目标说明故障自动切换主库挂了,从库能自动顶上数据不丢失切换过程中保证数据一致性业务少感知切换时间…...

导师又让重写?千笔写作工具,一键生成论文神器

你是否曾为论文选题而发愁?是否在深夜面对空白文档无从下笔?是否反复修改却总对表达不满意?论文写作不仅是学术能力的考验,更是时间和精力的挑战。对于大多数本科生来说,从开题到定稿,每一步都充满焦虑与压…...

计算机毕业设计 java 养殖基地信息管理系统 Java+SpringBoot 养殖基地运营管理平台 Web 版牲畜养殖产销管理系统

计算机毕业设计 java 养殖基地信息管理系统 9cpf69(配套有源码 程序 mysql 数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联 xi 可分享养殖业规模化发展,传统养殖基地依靠人工记录牲畜、库存、订单、客户信息&#xf…...

计算机毕业设计 java 养老院管理系统 Java+SpringBoot 智慧养老服务平台 Web 版养老院综合管理系统

计算机毕业设计 java 养老院管理系统 i7g5a9(配套有源码 程序 mysql 数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联 xi 可分享人口老龄化进程加快,传统养老院依靠人工管理老人信息、护理、物资、膳食等工作&#xf…...

导师推荐 10个一键生成论文工具:本科生毕业论文+开题报告写作全测评

在当前学术写作日益数字化的背景下,本科生在撰写毕业论文与开题报告时,常常面临选题困难、资料搜集繁琐、格式规范不熟悉等多重挑战。为了帮助更多学生高效完成学术任务,我们基于2026年的最新测评数据,结合实际使用场景与用户反馈…...

赶deadline必备!全场景通用AI论文神器 —— 千笔·专业论文写作工具

你是否曾为论文选题发愁,面对空白文档无从下笔?是否在反复修改中感到力不从心,却始终无法达到理想效果?论文写作不仅是学术能力的考验,更是时间与精力的挑战。而如今,有了千笔AI,这一切都将变得…...

OpenClaw-RL 论文解读:用“下一状态信号“统一所有智能体的强化学习训练

OpenClaw-RL 论文解读:用"下一状态信号"统一所有智能体的强化学习训练论文标题:OpenClaw-RL: Train Any Agent Simply by Talking 论文链接:https://arxiv.org/abs/2603.10165 作者:Yinjie Wang, Xuyang Chen, Xiaolong…...

IndexCache:跨层索引复用,让稀疏注意力推理再快一倍

IndexCache:跨层索引复用,让稀疏注意力推理再快一倍 论文标题:IndexCache: Accelerating Sparse Attention via Cross-Layer Index Reuse 作者:Yushi Bai, Qian Dong, Ting Jiang, Xin Lv, Zhengxiao Du, Aohan Zeng, Jie Tang, J…...

教育行业案例:jQuery如何集成百度WebUploader实现学校官网课件的自动分片续传?

前端大文件上传系统(纯原生JS实现)—— 专治各种不服IE9的倔强开发者 各位前端老炮儿们,今天给大家带来一个能兼容IE9的20G大文件上传系统,保证让你的客户感动到哭(或者吓跑)。毕竟在这个Vue3横行的时代&a…...

跨平台方案:JS如何通过百度WebUploader组件实现多终端大文件的目录结构分片?

前端老哥的“懒人”大文件上传方案(Vue3原生JS) 兄弟们!我是辽宁一名“头发没秃但代码量秃”的前端程序员,最近接了个外包活——给客户做文件管理系统,核心需求就仨字儿:“稳、省、兼容”!客户…...

医疗系统实践:Vue如何通过百度WebUploader组件优化病历图片的多线程分块上传?

客户这边啊,是汽车制造行业里的大哥大,是那种数一数二的企业。他们自己有一整套非常棒的业务系统,这套系统就像他们的得力助手,每天帮他们处理各种事情。但呢,随着行业竞争越来越激烈,技术也日新月异&#…...

从“稳”到“快”:滴滴2025财报背后的全球化布局与AI转型

在2025年第四季度,滴滴出行公布了其年度财报,这份数据不仅展示了其作为出行业务巨头的稳健实力,也揭示了其在国际市场加速布局以及自动驾驶与AI技术深度融合的未来版图。作为一家已经运营十余年的平台企业,滴滴在2025年实现了从“…...

逛超市遇到车神,上海这周变成了“F1痛城”!

这几天的上海,可能是国内第一座真正意义上的“F1痛城”。不是说街头有红绿灯比平时长,而是连去超市买菜、逛逛街,居然都有机会撞上世界级车手,感受一把“赛车手在民间的生活”。从3月10日开始,随着F1赛季正式拉开帷幕&…...

DEFCON CTF Write-up — zig-show

Challenge Overview 题目名称: zig-show 附件: zig-show flag.txt (server only) 服务接口: nc challenge.defcon.org 31338 连接后程序输出: Welcome to Zig Show! Give me a number: 输入数字后: Result: …...

DEFCON CTF Write-up — de-jean-erative

背景 DEF CON CTF 是全球最顶级的黑客竞赛之一,被称为“黑客奥林匹克”。每年来自世界各地的顶级安全研究团队都会参加该比赛。 比赛通常包含多个领域: Binary Exploitation Reverse Engineering Cryptography Web Security Pwn / Kernel AI / LLM explo…...

计算机毕业设计springboot四川特色小吃管理系统 基于SpringBoot的巴蜀风味小吃数字化运营平台 基于SpringBoot的川渝美食文化传承与商业管理系统

计算机毕业设计springboot四川特色小吃管理系统29ji1c34 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 在数字经济蓬勃发展的当下,传统餐饮业正经历着深刻的数字化…...

计算机毕业设计springboot城市的地铁综合服务管理系统 基于SpringBoot的城市地铁一体化服务管理平台 城市轨道交通数字化运营与乘客服务系统

计算机毕业设计springboot城市的地铁综合服务管理系统hsluqa90 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着城市化进程的不断加速,城市人口规模持续膨胀&…...

计算机毕业设计springboot大学生公寓管理系统 基于SpringBoot的高校学生宿舍信息化管理平台 基于SpringBoot的智慧校园住宿服务系统

计算机毕业设计springboot大学生公寓管理系统rm8571vv (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着高校招生规模的不断扩大,学生宿舍管理工作面临着前所未有…...

CLI-Anything 全面解析:一行命令,为任意软件生成 Agent 接口

一句话说清楚CLI-Anything 是一个 AI Agent 驱动的自动化工具。你给它一个软件的源码,它自动生成一套完整的命令行接口,让 Agent 通过 --help 发现功能、通过 --json 获取结构化输出,像人类点击菜单一样操控专业软件——但全程只用命令行。它…...

2026年最全Java面试题,及答案汇总!

适宜阅读人群 需要面试的初/中/高级 java 程序员想要查漏补缺的人想要不断完善和扩充自己 java 技术栈的人java 面试官 具体面试题 下面一起来看 208 道面试题,具体的内容。 一、Java 基础 1.JDK 和 JRE 有什么区别? 2. 和 equals 的区别是什么&am…...