Gen Tool 是一個沒有依賴關系的二進制文件,可以用來從數據庫生成結構。
使用方法:
go install gorm.io/gen/tools/gentool@latest
在項目根目錄,執行連接的數據庫中指定某幾張表結構生成數據庫model層
gentool -dsn "root:123456@tcp(localhost:3306)/go-demo-2025?charset=utf8mb4&parseTime=True&loc=Local" -tables "demo,user" -outPath "./gen_model/dao/query"
操作示例:
生成的model文件如下:
現在遇到的問題:使用此方法,如果只指定其中幾個表,那么其它已有的表的gen.go
會被覆蓋。
比如,現在我再次使用上面的命令,生成一個新的表:
gentool -dsn "root:123456@tcp(localhost:3306)/go-demo-2025?charset=utf8mb4&parseTime=True&loc=Local" -tables "common_config" -outPath "./gen_model/dao/query"
此時,剛才生成的 gen.go
里面之前生成的表的結構體就沒有了,程序也就跑不起來了:
出現這個情況,可能是這個工具的一個bug。如果改為生成全部表名,也不太方便,因為有時候其他小伙伴改動了某個表,不能隨著當前版本上線,就會很被動。除非每次執行這個命令的時候,都要把之前已經有的數據表名都帶上,會很麻煩。
目前暫未找到合適的解決方案,因此改為下面的方式:
在項目根目錄下面創建 gen.tool
文件,寫入內容如下:
version: "0.1"
database:dsn : "root:123456@tcp(localhost:3306)/go-demo-2025?charset=utf8mb4&parseTime=True&loc=Local"db : "mysql"tables : ["demo","user","common_config"]outPath : "./gen_model/dao/query"# 默認: gen.gooutFile : ""# generate unit test for query codewithUnitTest : false# generated model code's package namemodelPkgName : ""# generate with pointer when field is nullablefieldNullable : false# generate field with gorm index tagfieldWithIndexTag : false# generate field with gorm column type tagfieldWithTypeTag : false
這樣一來,如果需要生成新的數據表的model,只需要在 tables :
后面追加你想要新增生成的表名,已有的表名不要動!
然后在項目根目錄執行下面的命令就好了:
gentool -c "./gen.tool"
這樣生成的多個數據表的model就沒有問題了。
參考資料:
https://gorm.io/zh_CN/gen/gen_tool.html
https://insight.xiaoduoai.com/intelligent-frontiers/tech/gorm-use-gentool-tool-to-generate-structure-from-database.html