在 golang 的开发过程中,当我们使用 orm 的时候,常常需要将数据库表对应到 golang 的一个 struct,这些 struct 会携带 orm 对应的tag
,就像下面的 struct 定义一样:
type InsInfo struct {
Connections string `gorm:"column:connections"`
CPU int `gorm:"column:cpu"`
CreateTime time.Time `gorm:"column:create_time"`
Env int `gorm:"column:env"`
ID int64 `gorm:"column:id;primary_key"`
IP string `gorm:"column:ip"`
Organization string `gorm:"column:organization"`
Pass string `gorm:"column:pass"`
Port string `gorm:"column:port"`
RegionId string `gorm:"column:regionid"`
ServerIP string `gorm:"column:server_ip"`
Status int `gorm:"column:status"`
Type string `gorm:"column:type"`
UUID string `gorm:"column:uuid"`
}
这是 gorm 对应的数据库表的 struct 映射,即使数据表的字段不多,如果是手动写起来也是一些重复性的工作。像 MySQL 这种关系型数据库,我们一般会用 orm 去操作数据库,于是就想 mysql 的数据表能不能来自动生成 golang 的 struct 定义 ,减少重复性的开发工作(早点下班)。
调研了一下目前有一些工具,比如 chrome 插件 SQL2Struct(一款根据 sql 语句自动生成 golang 结构体的 chrome 插件),感觉用起来比较繁琐,每次需要进入数据库,执行 SQL 语句拿到建表语句 copy 到浏览器中,才能使用。在想能不能提供一个开箱即用的环境,提供 web 界面,我们只需要填写数据库信息,就可以一键生成对应的 ORM 的 struct,于是就诞生了这个项目: https://github.com/hantmac/fuckdb
mysql 有个自带的数据库information_schema
,有一张表COLUMNS
,它的字段包含数据库名、表名、字段名、字段类型等,我们可以利用这个表的数据,把对应的表的字段信息读取出来,然后再根据 golang 的语法规则,生成对应的 struct 。具体不详细展开了,感兴趣的可以去看下源码。
如果你的数据库在本地,那么只需要执行 docker-compose up -d
,
访问localhost:8000
,你就会得到下面的界面:
如果你的数据库在内网服务器上,你需要先修改后端接口的 ip:port,然后重新 build Docker 镜像,push 到自己的镜像仓库,然后修改 docker-compose.yaml,再执行docker-compose up -d
。修改的位置是:fuckdb/frontend/src/config/index.js
.
let APIdb2struct
if(process.env.NODE_ENV === "development"){
APIdb2struct = "http://0.0.0.0:8000" //修改为部署服务器的 ip
}else{
APIdb2struct = "http://0.0.0.0:8000" //修改为部署服务器的 ip
}
export default {
APIdb2struct
}
只需要填入数据库相关信息,以及你想得到的 golang 代码的package name
、struct name
,然后点击生成,就可以得到 gorm 对应的结构体映射。
在你的项目项目中只要 Ctrl+C&Ctrl+V 即可。我们知道 golang 的 struct 的 tag 有很多功能,这里也提供了很多 tag 的可选项,比如json
,xml
等,后面会增加更多的 tag 可选项支持。
web 版的特色功能是数据库信息缓存功能,能够记忆你之前填写过的数据库信息,省去了大量重复的操作,你不用再填写繁琐的数据库名,表名,只需一键,就可以得到对应的代码,配合附带 json-to-go 插件( https://github.com/mholt/json-to-go),开发效率得到极速提升。目前这个工具在我们组内已经开始使用,反馈比较好,节省了很多重复的工作,尤其是在开发的时候用到同一个库的多张表,很快就可以完成数据库表->strcut 的映射。
来看一段演示视频。
前几天有同学找上门,说 fuckdb 的 web 版部署后无法使用,解决了半天也没能让用户部署起来,反馈过来还是感觉部署有些复杂。反思了一下,对于一个工具化的软件,有些用户并不想做一些复杂的部署流程或者不熟悉部署操作,可能就是想暂时使用一下,所以应该让工具更加轻量化,更加开箱即用,于是连夜写了一个 fuckdb lite, 更容易上手使用,更方便的安装流程,1 分钟拿到你想要的代码。
基于 cobra( https://github.com/spf13/cobra),核心代码继承 web 版。
听取用户反馈,安装流程极简化,Mac 用户可以直接 brew install 安装
brew tap hantmac/tap && brew install fuckdb
curl https://github.com/hantmac/fuckdb/releases/download/v0.2/fuckdb_linux.tar.gz
下载、解压、安装fuckdb --help
From mysql schema generate golang struct with gorm, json tag
Usage:
fuckdb [command]
Available Commands:
generate use `fuckdb generate` to generate fuckdb.json
go fuckdb go to generate golang struct with gorm and json tag
help Help about any command
Flags:
-h, --help help for fuckdb
Use "fuckdb [command] --help" for more information about a command.
目前提供了两个主要命令,fuckdb generate
和 fuckdb go
,我们依次来看。
fuckdb generate
生成一个存储 MySQL 信息的fuckdb.json
文件,
编辑 fuckdb.json ,填写你的 MySQL 信息,该文件可复用,简单修改表名即可。
{
"db": {
"host": "localhost",
"port": 3306,
"password": "password",
"user": "root",
"table": "tableName",
"database": "example",
"packageName": "packageName",
"structName": "structName",
"jsonAnnotation": true,
"gormAnnotation": true
}
}
修改完文件后,就完成了准备工作,go go go!
执行
fuckdb go
来看一段演示操作(说好一分钟拿到代码,绝不超 1 秒)
比之前的 web 版的安装简直方便了太多,妈妈再也不用担心我加班啦。
ps: fuckdb.json 文件必须在操作目录下。
欢迎试用&反馈&Contribute 。代码地址: https://github.com/hantmac/fuckdb
官方资讯*最新技术*独家解读
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.