Forked from: https://github.com/jiazhoulvke/table2struct
更新特性:
- 支持 MySQL 8.0
- 支持 Struct 中的 JSON tag 的命名风格设置
- 注释符号后面添加空格
- 修复 db 中存在视图时无法生成代码的问题
- 修复存在 enum 类型的字段无法生成代码的问题
- 修复表名中存在 . 无法生成代码的问题
go get github.com/axiaoxin-com/table2struct
table2struct --tag_gorm --tag_sqlx --db_host localhost --db_port 3306 --db_user root --db_pwd pwd --db_name db [tablename]
先来看看 table2struct 支持的参数:
Usage of table2struct:
--db_host string 数据库ip地址 (default "127.0.0.1")
--db_name string 数据库名
--db_port int 数据库端口 (default 3306)
--db_pwd string 数据库密码 (default "root")
--db_user string 数据库用户名 (default "root")
--int64 是否将tinyint、smallint等类型也转换int64
--mapping strings 强制将字段名转换成指定的名称。如--mapping foo:Bar,则表中叫foo的字段在golang中会强制命名为Bar
--mapping_file string 字段名映射文件
--output string 输出路径,默认为当前目录
--package_name string 包名 (default "models")
--query string 查询数据库字段名转换后的golang字段名并立即退出
--skip_if_no_prefix 当表名不包含指定前缀时跳过不处理
--table_prefix string 表名前缀
--tag_gorm 是否生成gorm的tag
--tag_gorm_type 是否将type包含进gorm的tag (default true)
--tag_json 是否生成json的tag (default true)
--tag_json_case 指定JSON tag中字段的命名风格(snake:下划线风格,camel:大驼峰,lowcamel:小驼峰),默认为db中的原始字段
--tag_sqlx 是否生成sqlx的tag
--tag_xorm 是否生成xorm的tag
--tag_xorm_type 是否将type包含进xorm的tag (default true)
命令最后可以加表名来指定导出某些表,不加导出全部
比如你有一个名叫 mydatabase 的数据库,里面有一个 user 表:
CREATE TABLE `user` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(255) DEFAULT NULL,
`age` int(10) unsigned DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`status` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
通过运行table2struct --db_name mydatabase user
就可以生成一个 user.go 文件:
package models
// User user
type User struct {
ID int `json:"id"`
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
Age uint `json:"age"`
Address string `json:"address"`
Status int8 `json:"status"`
}
// TableName user
func (t *User) TableName() string {
return "user"
}
介绍几个需要注意的参数:
--int64
强制把所有整型字段全部声明为 int64,比如上面示例中的 Status 为Status int8
,加入参数--int64=true 后,生成的字段就会是Status int64
--tag_json
默认启用,会在 struct 的 tag 里增加json:"字段名"
- 同理,
--tag_sqlx
、--tag_xorm
、--tag_gorm
可以分别生成对应框架需要的 tag
假如你还不想真正生成字段,只是想预览一下数据库里的字段会变成什么名字,就可以用table2struct --query [表名.]字段名
进行查询,比如:
$ table2struct --query table1.foo
table1.foo => table1.Foo
有时对于一些自动转换的字段名不满意,比如 user 表中有一个 username 字段,自动转换出来的将会是 Username,但我想要它转成 UserName,那该怎么办呢?这时就可以通过--mapping
参数来强制将 username 转换成 UserName。
$ table2struct --mapping username:UserName --query username
username => UserName
--mapping 这个参数是可以无限制的增加的,也就是说你可以这样:
table2struct --mapping foo1:foo2 --mapping bar1:bar2 --mapping baz1:baz2
左边的字段是可以带上表名的,比如这样:
$ table2struct --mapping table1.foo1:foo2 --query foo1
table1.foo1 = table1.Foo1
$ table2struct --mapping table1.foo1:foo2 --query table1.foo1
table1.foo1 => table1.foo2
假如需要映射的字段名很多的话,放在一个文件里显然更合适一点,这时就可以用--mapping_file
这个参数了:
$ cat mapping.txt
foo:bar
$ table2struct --mapping_file mapping.txt --query foo
foo => bar
有时我们的表名都带有统一的前缀,比如:
google_table1 google_table2 google_table3
这时生成的文件名是 google_table1.go,结构名是 GoogleTable1。然而我们需要它生成的文件名是 table1.go,结构名是 Table1,这时就可以用到--table_prefix
这个参数了
$ table2struct --table_prefix google_