fuckdb Lite, 帮助你更快地生成 go struct 代码 fuckdb Lite, 帮助你更快地生成 go struct 代码 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
cloud0001

fuckdb Lite, 帮助你更快地生成 go struct 代码 fuckdb Lite, 帮助你更快地生成 go struct 代码

  •  
  •   cloud0001 Apr 6, 2020 4253 views
    This topic created in 2228 days ago, the information mentioned may be changed or developed.

    前言&背景

    在 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 。具体不详细展开了,感兴趣的可以去看下源码。

    Web 版

    连接本地数据库

    如果你的数据库在本地,那么只需要执行 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 namestruct 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 分钟拿到你想要的代码。

    fuckdb Lite

    原理

    基于 cobra( https://github.com/spf13/cobra),核心代码继承 web 版。

    安装

    听取用户反馈,安装流程极简化,Mac 用户可以直接 brew install 安装

    brew tap hantmac/tap && brew install fuckdb 

    使用

    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 generatefuckdb 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 

    Enjoy Your Code !

    来看一段演示操作(说好一分钟拿到代码,绝不超 1 秒)

    比之前的 web 版的安装简直方便了太多,妈妈再也不用担心我加班啦。

    ps fuckdb.json 文件必须在操作目录下。

    欢迎试用&反馈&Contribute 。代码地址: https://github.com/hantmac/fuckdb


     官方资讯*最新技术*独家解读 

    16 replies    2020-04-07 18:03:20 +08:00
    reus
        1
    reus  
       Apr 6, 2020   3
    我是不会在工作里引入一个用了 F word 的库或者工具的。
    cloud0001
        2
    cloud0001  
    OP
       Apr 6, 2020
    @reus 这么严谨
    dandycheung
        3
    dandycheung  
       Apr 6, 2020 via iPhone
    附议一楼。
    cloud0001
        4
    cloud0001  
    OP
       Apr 6, 2020
    @dandycheung 好吧,没想到大家这么讲文明,以后取名字不这么随意了
    lhx2008
        5
    lhx2008  
       Apr 6, 2020 via Android
    orm 生成数据库不行嘛。。
    CEBBCAT
        6
    CEBBCAT  
       Apr 6, 2020 via Android
    虽然一楼我屏蔽了,但我持和他一样的观点,除非这个库太厉害了,以至于我能顶住代码里浮现出的尴尬感
    tairan2006
        7
    tairan2006  
       Apr 6, 2020 via Androi
    老哥…看看 java 的方式呀。直接集成在 idea database 里,右键菜单就可以生成 model 了…参考 mybatis code helper 这个插件
    LiYanHong
        8
    LiYanHong  
       Apr 6, 2020
    英语的 Fword 可以接受
    EPr2hh6LADQWqRVH
        9
    EPr2hh6LADQWqRVH  
       Apr 6, 2020
    这是 golang 的锅你 fuck db 干什么
    namco1992
        10
    namco1992  
       Apr 6, 2020 via iPhone
    试试 sqlboiler 吧
    loading
        11
    loading  
       Apr 6, 2020 via Android   1
    我觉得 SQL2Struct 这种在线用 create tabke 语句生成的更省事。

    另外我现在用 goframe,自带工具 gf,还生成了 orm 等一大堆代码。
    runningman
        12
    runningman  
       Apr 6, 2020 via Android   1
    改名 funnydb
    cloud0001
        13
    cloud0001  
    OP
       Apr 7, 2020
    @lhx2008 思路不错,意思是 ORM 生成建表的 SQL 语句?
    lhx2008
        14
    lhx2008  
       Apr 7, 2020 via Android
    @cloud0001 GORM 本来就可以自动连 sql 建表。。了解一下
    cloud0001
        15
    cloud0001  
    OP
       Apr 7, 2020
    @tairan2006 java 这方面做得真的是牛,不管是生成还是写起来,很多魔法方法真的好用
    cloud0001
        16
    cloud0001  
    OP
       Apr 7, 2020
    @loading SQL2Struct 每次得进数据库获得建表语句,感觉还是麻烦了一点
    About     Help     Advertise     Blog     API     FAQ     Solana     5656 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 62ms UTC 03:36 PVG 11:36 LAX 20:36 JFK 23:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86