网上的包过于繁琐复杂。所以写个简单。mysql的多种数据类型没有全部实现转化。可以编译成可执行文件。

package main

import (
"flag"
"fmt"
"io"
"os"
"strings"
"gorm.io/gorm"
"gorm.io/driver/mysql" ) var db *gorm.DB func main() {
var host string
var user string
var pass string
var database string
var table string
var pack string
// 端口
var port string flag.StringVar(&host,"h","","数据库地址")
flag.StringVar(&pass,"p","","密码")
flag.StringVar(&user,"u","","用户")
flag.StringVar(&database,"d","","数据库")
flag.StringVar(&table,"t","","表名")
flag.StringVar(&port,"P","","端口")
flag.StringVar(&pack,"k","","端口")
// 解析
flag.Parse()
dsn := fmt.Sprintf(
"%s:%s@tcp(%s)/%s?parseTime=True&loc=Local",
user,
pass,
host,
database,
)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println(err)
}
type Field struct {
Field string `gorm:"column:Field"`
Type string `gorm:"column:Type"`
Comment string `gorm:"column:Comment"`
}
var fieldObj []Field
packageName := fmt.Sprintf("package %s\n\n", pack)
structName := toUp(table)
sns := fmt.Sprintf("type %s struct {", structName)
file := packageName + sns
sql := fmt.Sprintf("SELECT TABLE_NAME, COLUMN_COMMENT as Comment, COLUMN_NAME as Field, DATA_TYPE as Type from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='%s';", table)
db.Raw(sql).Scan(&fieldObj)
for _, value := range fieldObj {
f := fmt.Sprintf("\n\t%s %s `json:\"%s\"` // %s ", toUp(value.Field), getType(value.Type), value.Field, value.Comment )
file = file + f
}
sne := "\n}"
file = file + sne
tableName := fmt.Sprintf("\n\nfunc (%s) TableName() string {\n\treturn \"%s\"\n}" , structName, table )
file = file + tableName
fileName := fmt.Sprintf("%s.go", structName)
fileInfo, er := os.Stat(fileName)
if er == nil {
// 存在就是不允许覆盖
if fileInfo.Size() != 0 {
fmt.Println("文件已存在!")
return
}
} f, e := os.Create(fileName)
if e != nil {
fmt.Println("打开文件错误", e)
return
}
_, we := io.WriteString(f, file)
if we != nil {
fmt.Println("写入文件错误", we )
return
} } func toUp( field string ) string {
var nextUp bool
str := ""
for key, value := range field {
if key == 0 {
str = str + strings.ToUpper(string(value))
continue
}
if string(value) == "_" {
nextUp = true
continue
}
if nextUp {
str = str + strings.ToUpper(string(value))
nextUp = false
} else {
str = str + string(value)
}
} return str } func getType( typeString string ) string {
i := strings.Index(typeString, "(")
if i < 0 {
i = len(typeString) - 1
} t := typeString[:i]
m := map[string]string{
"tinyint" : "int64",
"smallint" : "int64",
"mediumint" : "int64",
"int" : "int64",
"bigint" : "int64",
"float" : "float64",
"decimal" : "string",
"bit" : "string",
"year" : "string",
"time" : "string",
"date" : "string",
"datetime" : "string",
"timestamp" : "string",
"char" : "string",
"varchar" : "string",
"tinytext" : "string",
"text" : "string",
"mediumtext" : "string",
"longtext" : "string",
"enum" : "string",
// 其他类型默认转字符
}
if val, ex := m[t]; ex {
return val
} else {
return "string"
}
}

示例执行命令:

 go run main.go  -h 127.0.0.1  -P 3306 -u test -p passwrod -d db -t table -k module

释义:

根据指定的数据库地址表名,在当前目录下为表生成 package 名为module 的go文件。

最新文章

  1. wpf 获取datagrid中模板中控件
  2. WPF整理-XAML构建后台类对象
  3. 002医疗项目-主工程模块yycgproject三层构建(三大框架的整合)
  4. Java再学习——线程之创建
  5. Rolls.java (page44)
  6. 服务器返回的JSON字符串
  7. LFS,编译自己的Linux系统 - 包和补丁
  8. SQLServer 2005 数据库定阅复制实现双机热备(主要是sharepoint 内容数据库)
  9. SSH整合缓存之-Memcached作为hibernate的二级缓存
  10. [python爬虫]爬取学校教务处成绩
  11. 关于socket.io的使用
  12. 一篇 SpringData+JPA 总结
  13. 深入浅出 JVM GC(4)常用 GC 参数介绍
  14. LeetCode8.字符串转整数(atoi)
  15. Maven 99.0-does-not-exist构建空包,排查依赖
  16. Apache Flink Training and sample code
  17. github 改位置
  18. 字典的setdefault() 和get()方法比较
  19. http://www.casualarena.com/
  20. dubbo集群容错之LoadBalance

热门文章

  1. Linux C 用GPS时间更新系统时间的方法。
  2. angular打包出现JavaScript堆内存不足、启动也会内存溢出解决办法\increase-memory-limit&#39; 不是内部或外部命令,
  3. 记OPNsense防火墙的安装过程 - 安全
  4. java 进阶P-3.7
  5. Unity之GPS定位(高德解析)
  6. dapr本地托管的服务调用体验与Java SDK的Spring Boot整合
  7. 基于NOSTR协议的“公有制”版本的Twitter,去中心化社交软件Damus用后感,一个极端走向另一个极端
  8. 【随笔记】Tina 系统的 ADB、声卡、网卡、串口多路共存
  9. v-html渲染页面的时候 css样式无效
  10. vscode unity omnisharp 配置问题,折腾两天终于解决了