5 Star 6 Fork 2

ha666/gen_sqlx_code

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
gen.go 49.03 KB
一键复制 编辑 原始数据 按行查看 历史
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640
package gen_mysql
import (
"bufio"
"fmt"
"gitee.com/ha666/gen_sqlx_code/app"
"gitee.com/ha666/gen_sqlx_code/gen_mysql/models"
"gitee.com/ha666/gen_sqlx_code/utils"
"log"
"os"
"os/exec"
"runtime"
"strings"
)
var (
p = ""
name = ""
conn_name = ""
conn_string = ""
table_infos []models.TableInfo
column_infos map[string][]models.ColumnInfo
index_infos map[string][]models.IndexInfo
err error
)
func Gen(_p string) {
defer func() {
if err := recover(); err != nil {
log.Fatalf("【Gen】ex:%v\n", err)
return
}
}()
p = _p
load_param()
}
func load_param() {
defer func() {
if err := recover(); err != nil {
log.Fatalf("【load_param】ex:%v\n", err)
return
}
}()
var (
address = ""
port = -1
account = ""
password = ""
err error
)
// 验证address参数
{
address, err = app.Cfg.GetValue(p, "address")
if err != nil {
log.Fatalf("【load_param】address解析出错:%s\n", err.Error())
}
if len(address) <= 0 {
log.Fatal("【load_param】address不能为空\n")
}
}
// 验证port参数
{
port, err = app.Cfg.Int(p, "port")
if err != nil {
log.Fatalf("【load_param】port解析出错:%s\n", err.Error())
}
if port <= 1024 {
log.Fatal("【load_param】port不能小于1024\n")
}
}
// 验证name参数
{
name, err = app.Cfg.GetValue(p, "name")
if err != nil {
log.Fatalf("【load_param】name解析出错:%s\n", err.Error())
}
if len(name) <= 0 {
log.Fatal("【load_param】name不能为空\n")
}
}
// 验证account参数
{
account, err = app.Cfg.GetValue(p, "account")
if err != nil {
log.Fatalf("【load_param】account解析出错:%s\n", err.Error())
}
if len(account) <= 0 {
log.Fatal("【load_param】account不能为空\n")
}
}
// 验证password参数
{
password, err = app.Cfg.GetValue(p, "password")
if err != nil {
log.Fatalf("【load_param】password解析出错:%s\n", err.Error())
}
if len(password) <= 0 {
log.Fatal("【load_param】password不能为空\n")
}
}
// 验证conn_name参数
{
conn_name, err = app.Cfg.GetValue(p, "conn_name")
if err != nil {
log.Fatalf("【load_param】conn_name解析出错:%s\n", err.Error())
}
if len(conn_name) <= 0 {
log.Fatal("【load_param】conn_name不能为空\n")
}
}
conn_string = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=true&loc=Asia%%2fShanghai", account, password, address, port, name)
log.Println(conn_string)
get_database_info()
}
func get_database_info() {
defer func() {
if err := recover(); err != nil {
log.Fatalf("【get_database_info】ex:%v\n", err)
return
}
}()
// 连接数据库
{
models.InitMainDB(conn_string)
}
// 查询所有的表
{
table_infos, err = models.GetTableInfos(name)
if err != nil {
log.Fatalf("【get_database_info】查询表出错:%s\n", err.Error())
}
if len(table_infos) <= 0 || len(table_infos[0].TableName) <= 0 {
log.Fatal("【get_database_info】查询表出错:没有找到表\n")
}
}
// 加载所有的列
{
var column_info []models.ColumnInfo
column_infos = make(map[string][]models.ColumnInfo, len(table_infos))
for _, table := range table_infos {
column_info, err = models.GetColumnInfos(name, table.TableName)
if err != nil {
log.Fatalf("【get_database_info】查询表%s出错:%s\n", table.TableName, err.Error())
}
if len(column_info) <= 0 {
log.Fatalf("【get_database_info】查询表%s出错:没有找到列\n", table.TableName)
}
column_infos[table.TableName] = column_info
}
}
// 加载所有的索引
{
var index_info []models.IndexInfo
index_infos = make(map[string][]models.IndexInfo, len(table_infos))
for _, table := range table_infos {
index_info, err = models.GetIndexInfos(name, table.TableName)
if err != nil {
log.Fatalf("【get_database_info】查询索引%s出错:%s\n", table.TableName, err.Error())
}
if len(index_info) <= 0 {
//log.Fatalf("【get_database_info】查询索引%s出错:没有找到\n", table.TableName)
continue
}
index_infos[table.TableName] = index_info
}
}
// 处理所有的表
{
count := len(table_infos)
for index, table := range table_infos {
log.Printf("【get_database_info】%d/%d,%s", index+1, count, table.TableName)
generator_model(&table)
generator_dao(&table)
}
}
// 执行gofmt
{
os_name := runtime.GOOS
switch os_name {
case "darwin", "linux":
{
cmd := exec.Command("sh", "-c", "gofmt -w model")
_, err := cmd.Output()
if err != nil {
log.Fatalf("【get_database_info】执行gofmt结果出错:%s\n", err.Error())
}
cmd = exec.Command("sh", "-c", "gofmt -w dao")
_, err = cmd.Output()
if err != nil {
log.Fatalf("【get_database_info】执行gofmt结果出错:%s\n", err.Error())
}
}
case "windows":
{
_, err := exec.Command("cmd", "/c", `gofmt -w model`).Output()
if err != nil {
log.Fatalf("【get_database_info】执行gofmt结果出错:%s\n", err.Error())
}
_, err = exec.Command("cmd", "/c", `gofmt -w dao`).Output()
if err != nil {
log.Fatalf("【get_database_info】执行gofmt结果出错:%s\n", err.Error())
}
}
default:
{
log.Println("【get_database_info】未知系统")
}
}
}
}
func generator_model(table *models.TableInfo) {
defer func() {
if err := recover(); err != nil {
log.Fatalf("【generator_model】表:%s,ex:%v\n", table.TableName, err)
return
}
}()
var (
folder = "model"
fd *os.File
w *bufio.Writer
column_info []models.ColumnInfo
index_info map[string][]models.IndexInfo
ok bool
is_exist_time_type = false
struct_name = table.TableName
)
// 获取列
{
column_info, ok = column_infos[table.TableName]
if !ok {
log.Fatalf("【generator_model】表:%s,没有找到列信息1", table.TableName)
}
if len(column_info) <= 0 {
log.Fatalf("【generator_model】表:%s,没有找到列信息2", table.TableName)
}
}
// 获取索引
{
if len(index_infos) > 0 {
index_info_s, ok := index_infos[table.TableName]
if ok && len(index_info_s) > 0 {
index_info = make(map[string][]models.IndexInfo)
for _, index := range index_info_s {
if tmp_index, ok := index_info[index.IndexName]; ok {
tmp_index = append(tmp_index, index)
index_info[index.IndexName] = tmp_index
} else {
index_info[index.IndexName] = []models.IndexInfo{index}
}
}
}
}
}
// 判断是否有主键
{
is_pk := false
for _, column := range column_info {
if strings.EqualFold(column.ColumnKey, "PRI") {
is_pk = true
break
}
}
if !is_pk && name != "mysql" {
log.Fatalf("【generator_model】表:%s,没有主键", table.TableName)
}
}
// 初始化操作
{
utils.ToBigHump(&struct_name)
for _, column := range column_info {
tmp_type := get_field_type(column.DataType)
if tmp_type == "time.Time" {
is_exist_time_type = true
}
}
err = utils.PathCreate("./" + folder)
if err != nil {
log.Fatalf("【generator_model】生成表:%s,创建目录出错:%s\n", table.TableName, err.Error())
}
fd, err = os.OpenFile("./"+folder+"/"+table.TableName+".go", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
log.Fatalf("【generator_model】生成表:%s,打开文件出错:%s\n", table.TableName, err.Error())
}
defer fd.Close()
fd, err = os.Create("./" + folder + "/" + table.TableName + ".go")
if err != nil {
log.Fatalf("【generator_model】生成表:%s,打开文件出错:%s\n", table.TableName, err.Error())
}
defer fd.Close()
w = bufio.NewWriter(fd)
}
// Package
{
fmt.Fprintln(w, fmt.Sprintf("package %s\n", folder))
if is_exist_time_type {
fmt.Fprintln(w, "import (")
fmt.Fprintln(w, "\t\"time\"")
fmt.Fprintln(w, ")")
}
}
// Struct
{
fmt.Fprintln(w, "")
if len(table.TableComment) > 0 {
fmt.Fprintln(w, fmt.Sprintf("// %s", table.TableComment))
}
fmt.Fprintln(w, fmt.Sprintf("type %s struct {", struct_name))
for _, column := range column_info {
fmt.Fprint(w, fmt.Sprintf("\t%s\t%s\t`db:\"%s\"`", column.ColumnNameCase, get_field_type(column.DataType), column.ColumnName))
if len(column.ColumnComment) > 0 {
fmt.Fprint(w, fmt.Sprintf("\t//%s", column.ColumnComment))
}
fmt.Fprintln(w, "")
}
fmt.Fprintln(w, "}")
}
// 写入文件
{
err = w.Flush()
if err != nil {
log.Fatalf("【generator_model】生成表:%s,刷新文件出错:%s\n", table.TableName, err.Error())
}
}
log.Printf("【generator_model】表:%s,成功!", table.TableName)
}
func generator_dao(table *models.TableInfo) {
defer func() {
if err := recover(); err != nil {
log.Fatalf("【generator_dao】表:%s,ex:%v\n", table.TableName, err)
return
}
}()
var (
folder = "dao"
fd *os.File
w *bufio.Writer
column_info []models.ColumnInfo
index_info map[string][]models.IndexInfo
ok bool
is_auto_increment = false
is_exist_deleteStatus = false
struct_name = table.TableName
init_index = 0
pk_count = 0
pk_column models.ColumnInfo
)
// 获取列
{
column_info, ok = column_infos[table.TableName]
if !ok {
log.Fatalf("【generator_dao】表:%s,没有找到列信息1", table.TableName)
}
if len(column_info) <= 0 {
log.Fatalf("【generator_dao】表:%s,没有找到列信息2", table.TableName)
}
}
// 获取索引
{
if len(index_infos) > 0 {
index_info_s, ok := index_infos[table.TableName]
if ok && len(index_info_s) > 0 {
index_info = make(map[string][]models.IndexInfo)
for _, index := range index_info_s {
if tmp_index, ok := index_info[index.IndexName]; ok {
tmp_index = append(tmp_index, index)
index_info[index.IndexName] = tmp_index
} else {
index_info[index.IndexName] = []models.IndexInfo{index}
}
}
}
}
}
// 判断是否有主键
{
is_pk := false
for _, column := range column_info {
if strings.EqualFold(column.ColumnKey, "PRI") {
is_pk = true
break
}
}
if !is_pk && name != "mysql" {
log.Fatalf("【generator_dao】表:%s,没有主键", table.TableName)
}
}
// 判断是否有deleteStatus字段
{
is_exist_deleteStatus = false
for _, column := range column_info {
if strings.EqualFold(column.ColumnName, "deleteStatus") {
is_exist_deleteStatus = true
break
}
}
}
// 初始化操作
{
utils.ToBigHump(&struct_name)
for _, column := range column_info {
if len(column.Extra) > 0 && strings.Contains(column.Extra, "auto_increment") {
is_auto_increment = true
}
}
pk_count = 0
err = utils.PathCreate("./" + folder)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,创建目录出错:%s\n", table.TableName, err.Error())
}
fd, err = os.OpenFile("./"+folder+"/"+table.TableName+".go", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,打开文件出错:%s\n", table.TableName, err.Error())
}
defer fd.Close()
fd, err = os.Create("./" + folder + "/" + table.TableName + ".go")
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,打开文件出错:%s\n", table.TableName, err.Error())
}
defer fd.Close()
w = bufio.NewWriter(fd)
}
// Package
{
fmt.Fprintln(w, fmt.Sprintf("package %s\n", folder))
fmt.Fprintln(w, "import (")
fmt.Fprintln(w, "\t\"bytes\"")
fmt.Fprintln(w, "\t\"database/sql\"")
fmt.Fprintln(w, "\t\"errors\"")
fmt.Fprintln(w, "\t\"github.com/jmoiron/sqlx\"")
fmt.Fprintln(w, "\t\"strings\"")
fmt.Fprintln(w, ")")
}
// DB
{
fmt.Fprintln(w, "")
fmt.Fprintln(w, fmt.Sprintf("var %sDao = %s{}", struct_name, table.TableName))
fmt.Fprintln(w, "")
fmt.Fprintln(w, fmt.Sprintf("type %s struct{}", table.TableName))
}
// IndexList
{
pk_count = 0
for key, index := range index_info {
if strings.EqualFold(key, "PRIMARY") {
for _, index_a := range index {
col, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,IndexList查询出错:%s\n", table.TableName, err.Error())
}
if len(col.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,IndexList没有找到列:%s\n", table.TableName, index_a.ColumnName)
}
pk_count += 1
pk_column = col
}
}
}
}
// Exist
{
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(column.ColumnComment) > 0 {
fmt.Fprint(w, column.ColumnComment)
} else {
fmt.Fprint(w, column.ColumnName)
}
}
fmt.Fprint(w, "】查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表中是否存在相关记录")
fmt.Fprint(w, fmt.Sprintf("func (d *%s) Exist(", table.TableName))
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, fmt.Sprintf("%s %s", column.ColumnName, get_field_type(column.DataType)))
}
fmt.Fprintln(w, ") (bool, error) {")
fmt.Fprint(w, fmt.Sprintf("\trows, err := %s.Queryx(\"select count(0) Count from %s where ", conn_name, table.TableName))
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, " and ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", column.ColumnName))
}
fmt.Fprint(w, "\",")
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
fmt.Fprintln(w, "\tcount := 0")
fmt.Fprintln(w, "\tif rows.Next() {")
fmt.Fprintln(w, "\t\terr = rows.Scan(&count)")
fmt.Fprintln(w, "\t\tif err != nil {")
fmt.Fprintln(w, "\t\t\treturn false, err")
fmt.Fprintln(w, "\t\t}")
fmt.Fprintln(w, "\t\treturn count > 0, nil")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn false, nil")
fmt.Fprintln(w, "}")
}
// Insert
{
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 插入单条记录到【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表中")
fmt.Fprint(w, fmt.Sprintf("func (d *%s) Insert(m *model.%s) (", table.TableName, struct_name))
if is_auto_increment {
fmt.Fprint(w, "int64")
} else {
fmt.Fprint(w, "bool")
}
fmt.Fprintln(w, ", error) {")
fmt.Fprint(w, fmt.Sprintf("\tresult, err := %s.Exec(\"insert into %s(", conn_name, table.TableName))
init_index = 0
for _, column := range column_info {
if len(column.Extra) > 0 && strings.Contains(column.Extra, "auto_increment") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprint(w, ") values(")
init_index = 0
for _, column := range column_info {
if len(column.Extra) > 0 && strings.Contains(column.Extra, "auto_increment") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, "?")
init_index++
}
fmt.Fprint(w, ")\",")
init_index = 0
for _, column := range column_info {
if len(column.Extra) > 0 && strings.Contains(column.Extra, "auto_increment") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, fmt.Sprintf("m.%s", column.ColumnNameCase))
init_index++
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprint(w, "\t\treturn ")
if is_auto_increment {
fmt.Fprint(w, "-1")
} else {
fmt.Fprint(w, "false")
}
fmt.Fprintln(w, ", err")
fmt.Fprintln(w, "\t}")
if is_auto_increment {
fmt.Fprintln(w, "\treturn result.LastInsertId()")
} else {
fmt.Fprintln(w, "\taffected, err := result.RowsAffected()")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn affected > 0, nil")
}
fmt.Fprintln(w, "}")
}
// Update
{
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(column.ColumnComment) > 0 {
fmt.Fprint(w, column.ColumnComment)
} else {
fmt.Fprint(w, column.ColumnName)
}
}
fmt.Fprint(w, "】修改【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表的单条记录")
fmt.Fprintln(w, fmt.Sprintf("func (d *%s) Update(m *model.%s) (bool, error) {", table.TableName, struct_name))
fmt.Fprint(w, fmt.Sprintf("\tresult, err := %s.Exec(\"update %s set ", conn_name, table.TableName))
init_index = 0
for _, column := range column_info {
if strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", column.ColumnName))
init_index++
}
fmt.Fprint(w, " where ")
init_index = 0
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, " and ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", column.ColumnName))
init_index++
}
fmt.Fprint(w, "\", ")
init_index = 0
for _, column := range column_info {
if strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("m.%s", column.ColumnNameCase))
init_index++
}
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
fmt.Fprint(w, ", ")
fmt.Fprint(w, fmt.Sprintf("m.%s", column.ColumnNameCase))
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\taffected, err := result.RowsAffected()")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn affected > 0, nil")
fmt.Fprintln(w, "}")
}
// InsertUpdate
{
if !is_auto_increment {
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 插入或修改【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表的单条记录")
fmt.Fprintln(w, fmt.Sprintf("func (d *%s) InsertUpdate(m *model.%s) (bool, error) {", table.TableName, struct_name))
fmt.Fprint(w, fmt.Sprintf("\tresult, err := %s.Exec(\"insert into %s(", conn_name, table.TableName))
init_index = 0
for _, column := range column_info {
if len(column.Extra) > 0 && strings.Contains(column.Extra, "auto_increment") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprint(w, ") values(")
init_index = 0
for _, column := range column_info {
if len(column.Extra) > 0 && strings.Contains(column.Extra, "auto_increment") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, "?")
init_index++
}
fmt.Fprint(w, ") ON DUPLICATE KEY UPDATE ")
init_index = 0
for _, column := range column_info {
if strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", column.ColumnName))
init_index++
}
fmt.Fprint(w, "\",")
init_index = 0
for i := 0; i < 2; i++ {
for _, column := range column_info {
if i > 0 && strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if len(column.Extra) > 0 && strings.Contains(column.Extra, "auto_increment") {
continue
}
if strings.EqualFold(column.ColumnName, "createTime") || strings.EqualFold(column.ColumnName, "updateTime") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ",")
}
fmt.Fprint(w, fmt.Sprintf("m.%s", column.ColumnNameCase))
init_index++
}
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\taffected, err := result.RowsAffected()")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn affected > 0, nil")
fmt.Fprintln(w, "}")
}
}
// Delete
{
if is_exist_deleteStatus {
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(column.ColumnComment) > 0 {
fmt.Fprint(w, column.ColumnComment)
} else {
fmt.Fprint(w, column.ColumnName)
}
}
fmt.Fprint(w, "】软删除【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表中的单条记录")
fmt.Fprint(w, fmt.Sprintf("func (d *%s) Delete(", table.TableName))
init_index = 0
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("%s %s", column.ColumnName, get_field_type(column.DataType)))
init_index++
}
fmt.Fprintln(w, ") (bool, error) {")
fmt.Fprint(w, fmt.Sprintf("\tresult, err := %s.Exec(\"update %s set deleteStatus=2 where ", conn_name, table.TableName))
init_index = 0
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if init_index > 0 {
fmt.Fprint(w, " and ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", column.ColumnName))
init_index++
}
fmt.Fprint(w, "\", ")
init_index = 0
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\taffected, err := result.RowsAffected()")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn false, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn affected > 0, nil")
fmt.Fprintln(w, "}")
}
}
// DeleteIn
{
if is_exist_deleteStatus && pk_count == 1 {
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(column.ColumnComment) > 0 {
fmt.Fprint(w, column.ColumnComment)
} else {
fmt.Fprint(w, column.ColumnName)
}
}
fmt.Fprint(w, "】数组软删除【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表中的多条记录")
fmt.Fprintln(w, fmt.Sprintf("func (d *%s) DeleteIn(%ss []%s) (count int64, err error) {", table.TableName, pk_column.ColumnName, get_field_type(pk_column.DataType)))
fmt.Fprintln(w, fmt.Sprintf("\tif len(%ss) <= 0 {", pk_column.ColumnName))
fmt.Fprintln(w, fmt.Sprintf("\t\treturn count, errors.New(\"%ss is empty\")", pk_column.ColumnName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tsql_str := bytes.Buffer{}")
fmt.Fprintln(w, fmt.Sprintf("\tsql_str.WriteString(\"update %s set deleteStatus=2\")", table.TableName))
fmt.Fprintln(w, fmt.Sprintf("\tsql_str.WriteString(\" where %s in(\")", pk_column.ColumnName))
fmt.Fprintln(w, fmt.Sprintf("\tquestion_mark := strings.Repeat(\"?,\", len(%ss))", pk_column.ColumnName))
fmt.Fprintln(w, "\tsql_str.WriteString(question_mark[:len(question_mark)-1])")
fmt.Fprintln(w, "\tsql_str.WriteString(\")\")")
fmt.Fprintln(w, "\tvar result sql.Result")
fmt.Fprintln(w, fmt.Sprintf("\tvals := make([]interface{}, 0, len(%ss))", pk_column.ColumnName))
fmt.Fprintln(w, fmt.Sprintf("\tfor _, v := range %ss {", pk_column.ColumnName))
fmt.Fprintln(w, "\t\tvals = append(vals, v)")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, fmt.Sprintf("result, err = %s.Exec(sql_str.String(), vals...)", conn_name))
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn count, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\taffected, err := result.RowsAffected()")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn count, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn affected, nil")
fmt.Fprintln(w, "}")
}
}
// Get
{
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(column.ColumnComment) > 0 {
fmt.Fprint(w, column.ColumnComment)
} else {
fmt.Fprint(w, column.ColumnName)
}
}
fmt.Fprint(w, "】查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表中的单条记录")
fmt.Fprint(w, fmt.Sprintf("func (d *%s) Get(", table.TableName))
init_index = 0
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("%s %s", column.ColumnName, get_field_type(column.DataType)))
init_index++
}
fmt.Fprintln(w, fmt.Sprintf(") (%s model.%s, err error) {", table.TableName, struct_name))
fmt.Fprint(w, fmt.Sprintf("\trows, err := %s.Queryx(\"select ", conn_name))
init_index = 0
for _, column := range column_info {
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprint(w, fmt.Sprintf(" from %s where ", table.TableName))
init_index = 0
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if init_index > 0 {
fmt.Fprint(w, " and ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", column.ColumnName))
init_index++
}
fmt.Fprint(w, "\", ")
init_index = 0
for _, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %s, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
fmt.Fprintln(w, fmt.Sprintf("\t%ss, err := d._RowsToArray(rows)", table.TableName))
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %s, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, fmt.Sprintf("\tif len(%ss) <= 0 {", table.TableName))
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %s, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, fmt.Sprintf("\treturn %ss[0], nil", table.TableName))
fmt.Fprintln(w, "}")
}
// In
{
if pk_count == 1 {
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, column := range column_info {
if !strings.EqualFold(column.ColumnKey, "PRI") {
continue
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(column.ColumnComment) > 0 {
fmt.Fprint(w, column.ColumnComment)
} else {
fmt.Fprint(w, column.ColumnName)
}
}
fmt.Fprint(w, "】数组查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表中的多条记录")
fmt.Fprintln(w, fmt.Sprintf("func (d *%s) GetIn(%ss []%s) (%ss []model.%s, err error) {", table.TableName, pk_column.ColumnName, get_field_type(pk_column.DataType), table.TableName, struct_name))
fmt.Fprintln(w, fmt.Sprintf("\tif len(%ss) <= 0 {", pk_column.ColumnName))
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %ss, errors.New(\"%ss is empty\")", table.TableName, pk_column.ColumnName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tsql_str := bytes.Buffer{}")
fmt.Fprint(w, "\tsql_str.WriteString(\"select ")
init_index = 0
for _, column := range column_info {
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprintln(w, " from \")")
fmt.Fprintln(w, fmt.Sprintf("\tsql_str.WriteString(\"%s\")", table.TableName))
fmt.Fprintln(w, fmt.Sprintf("\tsql_str.WriteString(\" where %s in(\")", pk_column.ColumnName))
fmt.Fprintln(w, fmt.Sprintf("\tparam_keys := strings.Repeat(\"?,\", len(%ss))", pk_column.ColumnName))
fmt.Fprintln(w, "\tsql_str.WriteString(param_keys[:len(param_keys)-1])")
fmt.Fprintln(w, "\tsql_str.WriteString(\")\")")
fmt.Fprintln(w, "\tvar rows *sqlx.Rows")
fmt.Fprintln(w, fmt.Sprintf("\tvals := make([]interface{}, 0, len(%ss))", pk_column.ColumnName))
fmt.Fprintln(w, fmt.Sprintf("\tfor _, v := range %ss {", pk_column.ColumnName))
fmt.Fprintln(w, "\t\tvals = append(vals, v)")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, fmt.Sprintf("\trows, err = %s.Queryx(sql_str.String(), vals...)", conn_name))
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %ss, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
fmt.Fprintln(w, "\treturn d._RowsToArray(rows)")
fmt.Fprintln(w, "}")
}
}
// Index
{
for key, index := range index_info {
if strings.Contains(key, "PRIMARY") {
continue
}
if len(index) <= 0 {
continue
}
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(tmp_column.ColumnComment) > 0 {
fmt.Fprint(w, tmp_column.ColumnComment)
} else {
fmt.Fprint(w, tmp_column.ColumnName)
}
}
fmt.Fprint(w, "】查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprint(w, "】表中的")
if index[0].NonUnique == 0 {
fmt.Fprint(w, "单")
} else {
fmt.Fprint(w, "多")
}
fmt.Fprint(w, "条记录,使用索引【")
fmt.Fprintln(w, fmt.Sprintf("%s,%s】", index[0].IndexName, index[0].IndexComment))
fmt.Fprint(w, fmt.Sprintf("func (d *%s) GetBy", table.TableName))
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
fmt.Fprint(w, tmp_column.ColumnNameCase)
}
fmt.Fprint(w, "(")
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("%s %s", tmp_column.ColumnName, get_field_type(tmp_column.DataType)))
init_index++
}
fmt.Fprint(w, fmt.Sprintf(") (%s", table.TableName))
if index[0].NonUnique > 0 {
fmt.Fprint(w, "s []")
} else {
fmt.Fprint(w, " ")
}
fmt.Fprintln(w, fmt.Sprintf("model.%s, err error) {", struct_name))
fmt.Fprint(w, fmt.Sprintf("\trows, err := %s.Queryx(\"select ", conn_name))
init_index = 0
for _, column := range column_info {
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprint(w, fmt.Sprintf(" from %s force index(%s) where ", table.TableName, key))
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, " and ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", tmp_column.ColumnName))
init_index++
}
if is_exist_deleteStatus && index[0].NonUnique != 0 {
fmt.Fprint(w, " and deleteStatus = 1")
}
fmt.Fprint(w, "\",")
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, tmp_column.ColumnName)
init_index++
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprint(w, fmt.Sprintf("\t\treturn %s", table.TableName))
if index[0].NonUnique > 0 {
fmt.Fprint(w, "s")
}
fmt.Fprintln(w, ", err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
if index[0].NonUnique == 0 {
fmt.Fprintln(w, fmt.Sprintf("\t%ss, err := d._RowsToArray(rows)", table.TableName))
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %s, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, fmt.Sprintf("\tif len(%ss) <= 0 {", table.TableName))
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %s, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, fmt.Sprintf("\treturn %ss[0], nil", table.TableName))
} else {
fmt.Fprintln(w, "\treturn d._RowsToArray(rows)")
}
fmt.Fprintln(w, "}")
}
}
// RowCount
{
// 查询全部记录数
{
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表总记录数")
fmt.Fprintln(w, fmt.Sprintf("func (d *%s) GetRowCount() (count int, err error) {", table.TableName))
fmt.Fprint(w, fmt.Sprintf("\trows, err := %s.Queryx(\"select count(0) Count from %s", conn_name, table.TableName))
if is_exist_deleteStatus {
fmt.Fprint(w, " where deleteStatus = 1")
}
fmt.Fprintln(w, "\")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn -1, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
fmt.Fprintln(w, "\tif rows.Next() {")
fmt.Fprintln(w, "\t\terr = rows.Scan(&count)")
fmt.Fprintln(w, "\t\tif err != nil {")
fmt.Fprintln(w, "\t\t\treturn -1, err")
fmt.Fprintln(w, "\t\t}")
fmt.Fprintln(w, "\t\treturn count, nil")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn -1, nil")
fmt.Fprintln(w, "}")
}
// Index
{
for key, index := range index_info {
if strings.Contains(key, "PRIMARY") {
continue
}
if len(index) <= 0 {
continue
}
if index[0].NonUnique == 0 {
continue
}
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(tmp_column.ColumnComment) > 0 {
fmt.Fprint(w, tmp_column.ColumnComment)
} else {
fmt.Fprint(w, tmp_column.ColumnName)
}
}
fmt.Fprint(w, "】查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprint(w, "】表总记录数,使用索引【")
fmt.Fprintln(w, fmt.Sprintf("%s,%s】", index[0].IndexName, index[0].IndexComment))
fmt.Fprint(w, fmt.Sprintf("func (d *%s) GetRowCountBy", table.TableName))
for _, index_a := range index {
fmt.Fprint(w, index_a.ColumnNameCase)
}
fmt.Fprint(w, "(")
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("%s %s", tmp_column.ColumnName, get_field_type(tmp_column.DataType)))
init_index++
}
fmt.Fprintln(w, ") (count int, err error) {")
fmt.Fprint(w, fmt.Sprintf("\trows, err := %s.Queryx(\"select count(0) Count from %s force index(%s) where ", conn_name, table.TableName, index[0].IndexName))
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, " and ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", tmp_column.ColumnName))
init_index++
}
if is_exist_deleteStatus {
fmt.Fprint(w, " and deleteStatus = 1")
}
fmt.Fprint(w, "\",")
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, tmp_column.ColumnName)
init_index++
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, "\t\treturn -1, err")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
fmt.Fprintln(w, "\tif rows.Next() {")
fmt.Fprintln(w, "\t\terr = rows.Scan(&count)")
fmt.Fprintln(w, "\t\tif err != nil {")
fmt.Fprintln(w, "\t\t\treturn -1, err")
fmt.Fprintln(w, "\t\t}")
fmt.Fprintln(w, "\t\treturn count, nil")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn -1, nil")
fmt.Fprintln(w, "}")
}
}
}
// RowList
{
// NonIndex
{
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 分页查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表的记录")
fmt.Fprint(w, fmt.Sprintf("func (d *%s) GetRowList", table.TableName))
fmt.Fprint(w, "(PageIndex, PageSize int) (")
fmt.Fprintln(w, fmt.Sprintf("%ss []model.%s, err error) {", table.TableName, struct_name))
fmt.Fprint(w, fmt.Sprintf("\trows, err := %s.Queryx(\"select ", conn_name))
init_index = 0
for _, column := range column_info {
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprint(w, fmt.Sprintf(" from %s", table.TableName))
if is_exist_deleteStatus {
fmt.Fprint(w, " where deleteStatus = 1")
}
fmt.Fprint(w, " limit ?,?\"")
fmt.Fprint(w, ", (PageIndex-1)*PageSize, PageSize")
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %ss, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
fmt.Fprintln(w, "\treturn d._RowsToArray(rows)")
fmt.Fprintln(w, "}")
}
// Index
{
for key, index := range index_info {
if strings.Contains(key, "PRIMARY") {
continue
}
if len(index) <= 0 {
continue
}
if index[0].NonUnique == 0 {
continue
}
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 根据【")
for index, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if index > 0 {
fmt.Fprint(w, ",")
}
if len(tmp_column.ColumnComment) > 0 {
fmt.Fprint(w, tmp_column.ColumnComment)
} else {
fmt.Fprint(w, tmp_column.ColumnName)
}
}
fmt.Fprint(w, "】分页查询【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprint(w, "】表的记录,使用索引【")
fmt.Fprintln(w, fmt.Sprintf("%s,%s】", index[0].IndexName, index[0].IndexComment))
fmt.Fprint(w, fmt.Sprintf("func (d *%s) GetRowListBy", table.TableName))
for _, index_a := range index {
fmt.Fprint(w, index_a.ColumnNameCase)
}
fmt.Fprint(w, "(")
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("%s %s", tmp_column.ColumnName, get_field_type(tmp_column.DataType)))
init_index++
}
fmt.Fprint(w, ", PageIndex, PageSize int) (")
fmt.Fprintln(w, fmt.Sprintf("%ss []model.%s, err error) {", table.TableName, struct_name))
fmt.Fprint(w, fmt.Sprintf("\trows, err := %s.Queryx(\"select ", conn_name))
init_index = 0
for _, column := range column_info {
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, column.ColumnName)
init_index++
}
fmt.Fprint(w, fmt.Sprintf(" from %s force index(%s) where ", table.TableName, index[0].IndexName))
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, " and ")
}
fmt.Fprint(w, fmt.Sprintf("%s=?", tmp_column.ColumnName))
init_index++
}
if is_exist_deleteStatus {
fmt.Fprint(w, " and deleteStatus = 1")
}
fmt.Fprint(w, " limit ?,?\",")
init_index = 0
for _, index_a := range index {
tmp_column, err := get_column_by_name(index_a.ColumnName, column_info)
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:%s\n", table.TableName, key, index_a.ColumnName, err.Error())
}
if len(tmp_column.ColumnName) <= 0 {
log.Fatalf("【generator_dao】生成表:%s,index:%s,column_name:%s,err:没有找到\n", table.TableName, key, index_a.ColumnName)
}
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, tmp_column.ColumnName)
init_index++
}
fmt.Fprint(w, ", (PageIndex-1)*PageSize, PageSize")
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\tif err != nil {")
fmt.Fprintln(w, fmt.Sprintf("\t\treturn %ss, err", table.TableName))
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\tdefer rows.Close()")
fmt.Fprintln(w, "\treturn d._RowsToArray(rows)")
fmt.Fprintln(w, "}")
}
}
}
// RowsToStruct
{
fmt.Fprintln(w, "")
fmt.Fprint(w, "// 解析【")
if len(table.TableComment) > 0 {
fmt.Fprint(w, table.TableComment)
} else {
fmt.Fprint(w, table.TableName)
}
fmt.Fprintln(w, "】表记录")
fmt.Fprintln(w, fmt.Sprintf("func (m *%s) _RowsToArray(rows *sqlx.Rows) (models []model.%s, err error) {", table.TableName, struct_name))
fmt.Fprintln(w, "\tfor rows.Next() {")
fmt.Fprintln(w, fmt.Sprintf("\t\tmo := model.%s{}", struct_name))
fmt.Fprint(w, "\t\terr = rows.Scan(")
init_index = 0
for _, column := range column_info {
if init_index > 0 {
fmt.Fprint(w, ", ")
}
fmt.Fprint(w, fmt.Sprintf("&mo.%s", column.ColumnNameCase))
init_index++
}
fmt.Fprintln(w, ")")
fmt.Fprintln(w, "\t\tif err != nil {")
fmt.Fprintln(w, "\t\t\treturn models, err")
fmt.Fprintln(w, "\t\t}")
fmt.Fprintln(w, "\t\tmodels = append(models, mo)")
fmt.Fprintln(w, "\t}")
fmt.Fprintln(w, "\treturn models, err")
fmt.Fprintln(w, "}")
}
// 写入文件
{
err = w.Flush()
if err != nil {
log.Fatalf("【generator_dao】生成表:%s,刷新文件出错:%s\n", table.TableName, err.Error())
}
}
log.Printf("【generator_dao】表:%s,成功!", table.TableName)
}
func get_column_by_name(column_name string, column_info []models.ColumnInfo) (column models.ColumnInfo, err error) {
for _, col := range column_info {
if strings.EqualFold(col.ColumnName, column_name) {
return col, nil
}
}
return
}
func get_field_type(field_type string) string {
type_result := ""
switch field_type {
case "bit":
type_result = "bool"
case "tinyint":
type_result = "int8"
case "smallint":
type_result = "int16"
case "int":
type_result = "int"
case "bigint":
type_result = "int64"
case "float", "decimal", "double", "numeric":
type_result = "float64"
case "char", "nchar", "varchar", "nvarchar", "text", "longtext", "mediumtext", "enum", "set":
type_result = "string"
case "blob", "longblob", "mediumblob", "tinyblob":
type_result = "[]byte"
case "date", "datetime", "datetime2", "timestamp":
type_result = "time.Time"
default:
type_result = "不支持的类型"
}
return type_result
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/ha666/gen_sqlx_code.git
git@gitee.com:ha666/gen_sqlx_code.git
ha666
gen_sqlx_code
gen_sqlx_code
73bfd39c7980

搜索帮助