go新手探索之路二
本期小目标
上一小节,已经使用go实现mysql数据库的连接和对数据的CRUD操作;但是,现在实际业务实现中很少会写原生的sql语句,所以,与时俱进,本期小目标定为使用ORM模型实现对数据库的操作。
go ORM 实现
1. orm插件
对比了很多orm框架,然而对比下来,觉得对于新手,仅掌握beego自带的orm框架就已足够了,熟悉掌握了自带的orm,那么其他的一些原理自然也懂得了。
安装包
go get github.com/astaxie/beego/client/orm
2. 数据库设计
这里为了方便之后的实现,此处开始设计比较完善的数据库表
- 用户表 user
- 组织表 group
- 用户信息表 user_info
- 地址表 address
- 地区编码表 address_code
- 模板表 template
- 订单信息表 order_info
- 配送信息表 delivery_info
- 售后表 after_sale
- 模板快照表 template_snapshot
- 公共字段表 common_field
user表:
列名 | 解释 |
---|---|
id | 自增长id |
group_id | 组织id |
status | 状态,分别有 on off freeze |
created_at | 创建时间 |
updated_at | 更新时间 |
deleted_at | 删除时间 |
user_info表:
列名 | 解释 |
---|---|
id | 自增长id |
user_id | 用户id |
user_name | 用户名 |
nickname | 昵称 |
avatar_url | 图像地址 |
phone | 手机号 |
birth | 出生日期 |
邮箱 | |
vip | 是否是vip |
vip_account | vip账号 |
created_at | 创建时间 |
updated_at | 更新时间 |
group表:
列名 | 解释 |
---|---|
id | 自增长id |
parent_id | 上级组织id |
name | 组织名称 |
status | 组织状态 on off |
created_at | 创建时间 |
updated_at | 更新时间 |
address表:
列名 | 解释 |
---|---|
id | 自增长id |
user_id | 用户id |
province | 省编码 |
city | 市编码 |
area | 区编码 |
detail_address | 详细地址 |
status | 状态 |
created_at | 创建时间 |
updated_at | 更新时间 |
address_code表:
列名 | 解释 |
---|---|
id | 唯一索引id |
partner_id | 上级id |
name | 省、市或区名称 |
created_at | 创建时间 |
updated_at | 更新时间 |
template表:
列名 | 解释 |
---|---|
id | 自增长id |
name | 模板名称 |
create_user_id | 创建用户id |
template_version | 模板版本号 |
template_type | 模板类型,input 或 output |
template_content | 模板内容,对象类型,包含字段id 和 字段填写属性(是否必填) |
status | 状态 |
created_at | 创建时间 |
updated_at | 更新时间 |
template_snapshot表:
列名 | 解释 |
---|---|
id | 自增长id |
template_ id | 模板id |
name | 模板名称 |
create_user_id | 创建用户id |
template_version | 模板版本号 |
template_type | 模板类型,input 或 output |
template_content | 模板内容,对象类型,包含字段id 和 字段填写属性(是否必填) |
created_at | 创建时间 |
updated_at | 更新时间 |
common_field表:
列名 | 解释 |
---|---|
id | 自增长id |
column_ type | 字段类型,input radio |
column_name | 字段在表中的英文名称 |
column_title | 字段显示中文名称 |
admin_id | 创建管理员id |
status | 状态 on off |
options | 如果是radio类型,则需要写入options,添加可供选择的下拉列表值 包括英文和中文名称 |
created_at | 创建时间 |
updated_at | 更新时间 |
order_info表:
列名 | 解释 |
---|---|
id | 自增长id |
send_user_id | 下单用户id |
receive_user_id | 收件人用户id |
send_address | 收件人地址 |
receive_address | 收件人地址 |
content | 发货物品信息 |
status | 订单状态 未发货 已发货 |
weight | 重量 |
express_company | 物流公司id |
expense | 快递费 |
customer_remark | 用户备注 |
shop_remark | 商家备注 |
created_at | 创建时间 |
updated_at | 更新时间 |
delivery_info表:
列名 | 解释 |
---|---|
id | 自增长id |
order_id | 订单id |
express_id | 快递单号 |
status | 快递状态 运输中 派送中 签收 |
send_time | 发件时间 |
receive_time | 收件时间 |
weight | 重量 |
expense | 快递费 |
insured | 是否保价 |
insured_amount | 保价金额 |
remark | 配送备注 |
created_at | 创建时间 |
updated_at | 更新时间 |
** after_sale表:**
列名 | 解释 |
---|---|
id | 自增长id |
express_id | 快递单号 |
back_express_id | 退回件快递单号 |
status | 退回中 确认签收 |
send_time | 发件时间 |
receive_time | 收件时间 |
expense | 快递费 |
remark | 配送备注 |
created_at | 创建时间 |
updated_at | 更新时间 |
结构图
3. 具体实现
其实具体的实现涉及比较多
总的来说,如果简单实现的话,那就是直接有一个main.go文件,写好连接数据库操作和创建数据库操作。
但这样粗暴的写法,不太适合于工作中,因为没有人会这么写,太不合适了。
这里推荐另一种写法
使用go-gormigrate/gormigrate
插件,通过migrate指令生成对应的table表
3.1命令执行脚本
具体实现:
migrate.go
package command
import (
"ExcelHandleProject/src/config/mysql"
"ExcelHandleProject/src/migration"
"ExcelHandleProject/src/pkg/logger"
"fmt"
"github.com/go-gormigrate/gormigrate/v2"
"github.com/spf13/cobra"
)
var migrateCmd = &cobra.Command{
Use: "migrate",
Short: "执行数据库迁移"