V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cloud0001
V2EX  ›  程序员

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

  •  
  •   cloud0001 · 2020-04-06 09:13:51 +08:00 · 3288 次点击
    这是一个创建于 1474 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言&背景

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

    另外我现在用 goframe,自带工具 gf,还生成了 orm 等一大堆代码。
    runningman
        12
    runningman  
       2020-04-06 18:43:44 +08:00 via Android   ❤️ 1
    改名 funnydb
    cloud0001
        13
    cloud0001  
    OP
       2020-04-07 18:00:55 +08:00
    @lhx2008 思路不错,意思是 ORM 生成建表的 SQL 语句?
    lhx2008
        14
    lhx2008  
       2020-04-07 18:01:37 +08:00 via Android
    @cloud0001 GORM 本来就可以自动连 sql 建表。。了解一下
    cloud0001
        15
    cloud0001  
    OP
       2020-04-07 18:02:06 +08:00
    @tairan2006 java 这方面做得真的是牛,不管是生成还是写起来,很多魔法方法真的好用
    cloud0001
        16
    cloud0001  
    OP
       2020-04-07 18:03:20 +08:00
    @loading SQL2Struct 每次得进数据库获得建表语句,感觉还是麻烦了一点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2289 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 837ms · UTC 00:42 · PVG 08:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.