gorm逆向生成model類和json類

2021-10-25 19:26:09 字數 4354 閱讀 2450

因為專案轉go,覺得寫model和json很重複,所以簡單寫了個工具類

專案全域性

先定義資料庫類和資料庫鏈結

package conf

// model儲存路徑

const modelpath = "./models/"

// json儲存路徑

const jsonpath = "./reply/"

type dbconf struct

// 資料庫鏈結配置

var masterdbconfig dbconf = dbconf

gorm的資料庫鏈結

package db

import (

"cn.saas/charge-***/conf"

"fmt"

"gorm.io/driver/mysql"

"gorm.io/gorm"

)var instance *gorm.db

func init() )

if err != nil

}

專案下建立兩個資料夾,models和reply

定義查詢語句的model類

package generate

type field struct

package generate

type table struct

最後就是生成方法了

} tables := gettables(tablenamesstr) //生成所有表資訊

ch := make(chan int)

for _, table := range tables

fmt.println(

}//獲取表資訊

func gettables(tablenames string) table

return tables

}//獲取所有字段資訊

func getfields(tablename string) field

//生成model

func generatemodel(table table, fields field)

content += "type " + generator.camelcase(table.name) + " struct

content += "}\n"

content += "func (entity *" + generator.camelcase(table.name) + ") tablename() string "

filename := conf.modelpath + table.name + ".go"

var f *os.file

var err error

if checkfilei***ist(filename)

} f, err = os.create(filename)

if err != nil

defer f.close()

_, err = io.writestring(f, content)

if err != nil else

}//獲取字段型別

func getfiledtype(field field) string else

case "integer":

if typearr1[1] == " unsigned" else

case "mediumint":

if typearr1[1] == " unsigned" else

case "bit":

if typearr1[1] == " unsigned" else

case "year":

if typearr1[1] == " unsigned" else

case "smallint":

if typearr1[1] == " unsigned" else

case "tinyint":

if typearr1[1] == " unsigned" else

case "bigint":

if typearr1[1] == " unsigned" else

case "decimal":

return "*float64"

case "double":

return "*float32"

case "float":

return "*float32"

case "real":

return "*float32"

case "numeric":

return "*float32"

case "timestamp":

return "*time.time"

case "datetime":

return "*jsontime.jsontime"

case "time":

return "*time.time"

case "date":

return "*time.time"

default:

return "*string" }}

//獲取欄位json描述

func getfieldjson(field field) string

// 首字母小寫

func lcfirst(str string) string

return ""

}//獲取欄位gorm描述

func getfieldgorm(field field) string

if field.key == "uni"

if field.extra == "auto_increment"

if field.null == "no"

return fieldcontext + `"`

}//獲取字段說明

func getfieldcomment(field field) string

return ""

}//檢查檔案是否存在

func checkfilei***ist(filename string) bool

return exist

}//生成json

func generatejson(table table, fields field, ch chan int)

content += "}\n"

filename := conf.jsonpath + table.name + "_reply.go"

if checkfilei***ist(filename)

f, err := os.create(filename)

if err != nil

_, err = io.writestring(f, content)

if err != nil else

defer f.close()

ch close(ch)

}寫的比較粗俗簡單,生成那裡用到通道,是因為用了go協程,防止main方法先跑完導致生成不完全

如果想加快,可以把switchcase那裡改造成map也會更快

不過就只在本地跑就無所謂了

最後是main方法

func main()
把go.mod我也放上來

直接go mod download即可

逆向工程生成的Example類的使用

二.example類的使用 example類的成員 公升序還是降序 欄位 空格 asc desc protected string orderbyclause 去除重複 true是選擇不重覆記錄,false,反之 protected boolean distinct 自定義查詢條件 protecte...

Django 模型(model)類的查詢集和過濾器

在控制器上呼叫方法返回查詢集 queryset 查詢經過過濾器篩選後返回新的查詢集,所以可以寫成鏈式呼叫。queryset支援鏈式查詢 author.objects.filter name contains weizhongtu filter email tuweizhong 163.com aut...

IDEA 生成類注釋和方法注釋

目錄 二 生成類注釋 02 三 兩種類注釋生成的區別 四 生成方法注釋 classname j a author 建立人名稱 version 1.0.0 description todo createtime 年 月 日 依次開啟file settings editor file and code ...