资讯动态

5分钟跑通 HotGo 数据库:GoFrame ORM 连接配置与 CRUD 代码生成

发布时间:2026/10/22 1:26:22 来源:尧图企业网站定制
5分钟跑通 HotGo 数据库GoFrame ORM 连接配置与 CRUD 代码生成【免费下载链接】hotgoHotGo 是AI 赋能企业级全栈前后端分离开发及移动应用基础平台基于 Vue 和 GoFrame2.0 构建内置 AI 开发规范、适配主流 AI 开发工具人机协同高效开发。集成 jwt 鉴权、动态路由菜单、casbin 鉴权、消息队列、定时任务等功能预置各类常用场景文件助力专注业务开发。项目地址: https://gitcode.com/GitHub_Trending/ho/hotgo做一个中后台系统最耗时间的往往不是业务逻辑而是数据库这条链每张表手工铺一遍 DAO、控制器、表单、列表页一天就耗在接线上了。HotGo 把这条链路压成了一步——只要建表时遵守字段约定后台的「代码生成」就能产出 API、控制器、业务逻辑甚至 Vue 页面文件热编译下生成完直接可用。这篇文章带你走一遍 HotGo 数据库层的完整玩法从连接配置、表结构约定到生成后的增删改查再到事务、关联查询和分页优化的少踩坑写法。快速上手 ⚡先说目标5 分钟内让浏览器打开一个能登录、能查业务数据的后台。假设你本机已装好 Go≥1.23、Node≥20和 MySQL≥5.7InnoDB 引擎或 PostgreSQL ≥14并建好了hotgo库库怎么建、配置怎么填下一节细讲现在只需要把服务拉起来。克隆仓库并启动服务端监听 8000 端口git clone https://gitcode.com/GitHub_Trending/ho/hotgo cd hotgo/server go mod tidy go run main.go再开一个终端启动前端cd hotgo/web pnpm install pnpm run dev # 默认 8001 端口浏览器打开http://localhost:8001/admin用admin / 123456登录看到的就是下图这个管理后台。登录页底部那排演示角色按钮点一下就能进后台——主面板的卡片指标、流量趋势都在实时读业务表说明 HotGo 数据库链路已经全程通了。跑通这一步后我们看看它内部怎么分工。看懂架构一次请求穿过哪四层一条 CRUD 请求在 HotGo 里经过的分工是这样的Vue 页面 (web/src/views) │ HTTP JSON ▼ router / controller 参数绑定、登录与权限拦截 ▼ logic 业务逻辑校验、事务、数据组装 ▼ dao 每张表一个 Go 文件列名、主键、Transaction ▼ gdb (GoFrame ORM) ──► MySQL / PostgreSQLserver/internal/dao/每张数据表对应一个文件由 GoFrame CLI 生成提供表全局实例和列名常量server/internal/logic/业务代码住在这里列表、新增、修改、删除都是它server/internal/library/hgorm/HotGo 自研数据库库提供关联表 Join、关键词多条件查询、软删除/租户/操作人钩子server/manifest/config/config.yaml唯一决定「连哪个库」的地方hggen后台「开发工具 → 代码生成」背后的引擎把表结构变成整套 CRUD数据流向永远是单向的页面 → 控制器 → 逻辑层 → dao → gdb。你写业务只碰 logic 和 dao 两层其余框架代劳。逐步配置三步完成安装1. 建库并导入初始表结构仓库里带了完整建库脚本导入它你就拥有了菜单、角色、字典等全套基础表mysql -uroot -p -e CREATE DATABASE hotgo DEFAULT CHARSET utf8mb4; mysql -uroot -p hotgo hotgo/storage/data/hotgo.sql执行完SHOW TABLES;能看到hg_admin_member、hg_sys_config等以hg_为前缀的表建库成功。2. 配置数据库连接复制配置模板并修改连接串这一步决定后端连哪个库cd hotgo/server/manifest/config cp config.example.yaml config.yaml编辑config.yaml里的database.default.linkdatabase: default: # 格式mysql:账号:密码tcp(主机:端口)/库名?参数 link: mysql:hotgo:hg123456.tcp(127.0.0.1:3306)/hotgo?locLocalparseTimetruecharsetutf8mb4 Prefix: hg_ # 表前缀dao 生成时会自动剥掉注意 DSN 末尾的parseTimetrue不能省否则 datetime 字段无法映射为 Go 时间类型Prefix要和建库脚本的前缀一致。想用 PostgreSQL 就把 link 换成pgsql:postgres:hg123456tcp(127.0.0.1:5432)/hotgo完整示例见 config.example.yaml。还有一处容易漏server/hack/config.yaml里也有一份数据库配置它供代码生成器读取表结构两份必须保持一致否则会报权限错误排错手册里有对应条目。3. 启动并验证按「快速上手」里的命令分别启动server和web登录后台。看到主面板出数配置就全部生效了若连接报错九成是 link 写错或库没建。核心用法给「测试分类」做一套增删改查HotGo 有个内置演示表hg_test_category测试分类我们直接以它为例走一遍业务线。先说清表结构约定这是代码生成的门票idbigint 主键必须有created_at/updated_at自动填充创建/修改时间deleted_at存在即启用软删除查询自动过滤删除只更新时间不删数据status、sort状态与排序表单会默认生成下拉和递增排序值字段注释会直接变成页面列名完整规则见 数据库字段约定文档。登录后台 → 开发工具 → 代码生成选中hg_test_category在字段设置页勾选要展示、可查询的列后提交生成流程截图见 生成 CURD 指南。生成完后台菜单自动多出一个「测试分类」列表页长这样菜单、路由、API、页面全部就位。下面看生成出来的后端代码重点在 logic 层。列表拼条件 分页。这段代码解决「按名称搜索、分页返回」的问题mod : s.Model(ctx) // 自动带上 deleted_at IS NULL 软删除过滤 mod mod.Fields(sysin.TestCategoryListModel{}) // 只取列表需要的列 if in.Name ! { mod mod.WhereLike(dao.TestCategory.Columns().Name, %in.Name%) } mod mod.Page(in.Page, in.PerPage) // 分页 mod mod.OrderAsc(dao.TestCategory.Columns().Sort).OrderDesc(dao.TestCategory.Columns().Id) err mod.ScanAndCount(list, totalCount, false) // 数据与总数一次拿跑完你能看到后台的分类列表支持名称模糊搜索、按 sort 升序 id 降序排列分页器总数准确。s.Model(ctx)是生成代码的统一入口软删除过滤就在这里自动生效你不用手写。新增/修改一个方法包办套上事务。有 ID 走更新、无 ID 走插入保证写操作原子性return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { if in.Id 0 { // 有主键更新 return s.Model(ctx).Fields(sysin.TestCategoryUpdateFields{}). WherePri(in.Id).Data(in).Update() } // 无主键插入空字段自动忽略 return s.Model(ctx, handler.Option{FilterAuth: false}). Fields(sysin.TestCategoryInsertFields{}).Data(in).OmitEmptyData().Insert() })执行后列表里出现新分类行created_at、created_by由框架钩子自动填充——操作人来自当前登录上下文你一行都不用写。删除软删除。生成的删除逻辑只有一句// Unscoped 跳过软删除过滤定位到目标行 // 框架只更新 deleted_at不物理删除数据 s.Model(ctx).WherePri(in.Id).Unscoped().Delete()跑完该行立即从列表消失数据库里它还在deleted_at有了值。后悔了直接把这个字段置空就能恢复。进阶技巧事务、关联查询与分页多表写入必须套事务。以提现申请为例要同时写提现记录和扣减余额任何一步失败都得整体回滚err g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { id, err : dao.AdminCash.Ctx(ctx).Data(g.Map{ dao.AdminCash.Columns().MemberId: in.MemberId, dao.AdminCash.Columns().Money: in.Money, // ...其他字段 }).InsertAndGetId() // 1. 写提现记录 if err ! nil { return err } // 2. 扣余额此处失败则上面那条记录一起回滚 _, err service.AdminCreditsLog().SaveBalance(ctx, /* ... */) return err })跑完的效果是余额扣成功才存在提现记录扣失败两边都不留痕。完整写法见 cash.go。关联表字段一次 JOIN 出来。列表要展示分类名称这类关联表字段时别循环查 N 次主表——HotGo 在 hgorm 库 提供了 Join 工具主表和关联表字段在一条 SQL 里取齐// 生成 hg_test_category.id hg_sys_gen_curd_demo.category_id cond : hgorm.GenJoinOnRelation(hg_sys_gen_curd_demo, category_id, hg_test_category, testCategory, id) mod mod.LeftJoin(cond...). Where(dao.SysGenCurdDemo.Columns().Status, 1)执行后每行数据直接带上别名为testCategory的分类字段没有 N1 问题。多表关联的完整生成流程参考 关联表 CURD 指南。分页与查询性能三件事。一是先Count()为 0 就提前返回省掉空页查询二是Fields限定返回列别把 text 大字段全量拖出三是关键词搜索用hgorm.FilterKeywordsWithOr对多列做 OR 匹配代替手写一长串 Where。按约定字符串字段默认 LIKE、数字与时间默认精确匹配查询习惯和 SQL 默认查询方式 对齐即可。生成的分页列表就是这样的效果排错手册四个高频问题现象原因解法代码生成报fetching tables failed ... Access denied 1045config.yaml与hack/config.yaml两份数据库配置不一致或账号无该库权限保持 server/manifest/config/config.yaml 与 server/hack/config.yaml 的 link 一致用该账号手动SHOW TABLES验证权限刚生成完页面提示服务器错误请稍候重试或 404热编译触发了服务端重启前端先加载完、接口后恢复等几秒刷新不放心就手动重启 server后台看不到「开发工具」菜单system.mode设为product时开发功能自动隐藏把config.yaml里mode改回developdatetime 字段报时间解析/映射错误DSN 缺parseTimetrue在 link 参数里补上parseTimetruelocLocalcharsetutf8mb4更细的生成类问题可翻 生成常见问题。收束HotGo 数据库的思路可以浓缩成两句话用表结构约定换代码生成用 dao 与 logic 分层换可维护性。把本文的链路走通后建议按三个方向继续读一遍 storage/data/hotgo.sql建表语句就是字段约定的最佳字典改一改config.yaml里hggen的模板路径让生成的代码长成你要的样子跑一跑 casbin_test.go、sorter_test.go 这类仓库自带测试用例看框架能力的边界。整套中文文档在 docs/guide-zh-CN/ 目录下遇到问题先从那里找。【免费下载链接】hotgoHotGo 是AI 赋能企业级全栈前后端分离开发及移动应用基础平台基于 Vue 和 GoFrame2.0 构建内置 AI 开发规范、适配主流 AI 开发工具人机协同高效开发。集成 jwt 鉴权、动态路由菜单、casbin 鉴权、消息队列、定时任务等功能预置各类常用场景文件助力专注业务开发。项目地址: https://gitcode.com/GitHub_Trending/ho/hotgo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑