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

根据建表sql语句生成go的struct代码工具

sql2struct

一个根据"CREATE TABLE"建表语句生成对应的Go语言结构体的工具,暂只支持 MySQL 表。

开发目的

在 github 中找到一些 sql2struct,但要么是 chrome 插件,要么是在线工具,要么是需要连接 MySQL,不是很方便。本 sql2struct 根据 SQL 文件中的建表语句来生成 Go 的 struct,可集成到 Makefile 等中,方便使用。

安装方法

go install github.com/eyjian/sql2struct@latest

执行成功后,在 $GOPATH/bin 目录下可找到 sql2struct:

# file `go env GOPATH`/bin/sql2struct
/root/go/bin/sql2struct: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

使用示例

sql2struct % cat example-01.sql
DROP TABLE t_products;
CREATE TABLE t_products (f_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '商品ID',f_name VARCHAR(255) NOT NULL COMMENT '商品名称',f_description TEXT,f_price DECIMAL(10, 2) NOT NULL,f_weight FLOAT NOT NULL COMMENT '商品重量(kg)',f_quantity SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品库存数量',f_is_active TINYINT(1) NOT NULL DEFAULT 1 COMMENT '商品是否激活(0 - 未激活,1 - 激活)',f_rating DOUBLE COMMENT '商品评分',f_created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '商品创建时间',f_updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP COMMENT '商品更新时间',UNIQUE INDEX idx_name_at (f_name),INDEX idx_created_at (f_created_at),KEY idx_updated_at (f_updated_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
sql2struct % 
sql2struct % ./sql2struct -sf=./example-01.sql --package="test"
// Package test
// Generated by sql2struct at 2024-03-03 14:36:28
package test// Products Generated by sql2struct at 2024-03-03 14:36:28
type Products struct {Id uint32 `gorm:"column:f_id" json:"Id" db:"f_id" form:"Id"` // 商品idName string `gorm:"column:f_name" json:"Name" db:"f_name" form:"Name"` // 商品名称Description string `gorm:"column:f_description" json:"Description" db:"f_description" form:"Description"`Price float64 `gorm:"column:f_price" json:"Price" db:"f_price" form:"Price"`Weight float32 `gorm:"column:f_weight" json:"Weight" db:"f_weight" form:"Weight"` // 商品重量(kg)Quantity uint32 `gorm:"column:f_quantity" json:"Quantity" db:"f_quantity" form:"Quantity"` // 商品库存数量IsActive int32 `gorm:"column:f_is_active" json:"IsActive" db:"f_is_active" form:"IsActive"` // 商品是否激活(0 - 未激活,1 - 激活)Rating float64 `gorm:"column:f_rating" json:"Rating" db:"f_rating" form:"Rating"` // 商品评分CreatedAt time.Time `gorm:"column:f_created_at" json:"CreatedAt" db:"f_created_at" form:"CreatedAt"` // 商品创建时间UpdatedAt time.Time `gorm:"column:f_updated_at" json:"UpdatedAt" db:"f_updated_at" form:"UpdatedAt"` // 商品更新时间
}

使用约束

  • sql 中的分割须为空格,而不能是 TAB
  • 命令行参数"–sf"指定的 sql 文件只能包含一个"create table"建表语句,不指定同一个 sql 文件含多个建表语句,但大写或者小写不影响
  • 生成的时为排版的,需要自行格式化
  • 生成的 Go 结构体中,字段名、类型、注释等信息都是从 sql 语句中解析出来的,如果 sql 语句中的字段名、类型、注释等信息不规范,生成的 Go 结构体也会不规范

使用提示

  • 建议将 sql2struct 放到 PATH 指定的目录,比如 /usr/bin/ 或 $GOPATH/bin/ 目录下,以便在任何地方都可以直接使用
  • 运行成功,程序退出码为 0,否则为非 0,Shell 中可通过"$?”的值来区分
  • 结果直接屏幕输出,可重定向到文件中
  • 通过重定向,可实现多个 SQL 文件对应一个 Go 代码文件
  • 默认不输出取表名函数,可通过参数"–with-tablename-func"开启
  • 默认 json 和 form 两种 tag 会去掉字段名的前缀部分,但可通过命令行参数"-json-with-prefix”和"-form-with-prefix"分别控制

Makefile 中应用示例

sql2struct % cat Makefile.example
all: sql sql-01 sql-02 sql-03.PHONY: sqlsql:rm -f example.gosql-01: example-01.sqlsql2struct -sf=$< -package="main" -with-tablename-func=true >> example.gosql-02: example-02.sqlecho "" >> example.go&&sql2struct -sf=$< -with-tablename-func=true >> example.gosql-03: example-03.sqlecho "" >> example.go&&sql2struct -sf=$< -json-with-prefix=true >> example.go
http://www.lryc.cn/news/310256.html

相关文章:

  • Qt 自定义长条进度条(类似播放器进度条)
  • 休息日的思考与额外题——双指针、原地哈希day28
  • 数据修改
  • Android JNI复杂用法,回调,C++中调用Java方法
  • C++从零开始的打怪升级之路(day41)
  • uni-app app实现web-view H5图片长按下载
  • 全量知识系统问题及SmartChat给出的答复 之5
  • DolphinScheduler——工作流实例的生命周期
  • 阻塞和非阻塞网络io有什么区别,分别有哪些应用场景?
  • 面试数据库篇(mysql)- 12分库分表
  • LaTeX中的多行数学公式
  • 绕过5秒盾Cloudflare和DDoS-GUARD
  • react 原理揭秘
  • el-table实现转置表格
  • (3)(3.1) FlightDeck FrSky发射器应用程序
  • 【Unity】导入IAP插件后依赖冲突问题 com.android.billingclient冲突
  • docker 转为docker-compose(composerize 命令)
  • 【Golang切片】
  • React-router的创建和第一个组件
  • 计算机设计大赛 深度学习猫狗分类 - python opencv cnn
  • Linux服务器磁盘及内存用量监控Python脚本(推送钉钉群通知)
  • Android13 Audio框架
  • kafka消费者接收不到消息
  • Python如何从SQL Server存取数据?
  • 学校机房Dev c++解决中文乱码问题
  • 基于java+springboot景区行李寄存管理系统设计和实现
  • 03-grafana的下拉列表选项制作-grafana的变量
  • Linux网络编程—— IO多路复用
  • C++进阶(二) 多态
  • 【C++】set、multiset与map、multimap的使用