golang 用gorm生成module文件
网上的包过于繁琐复杂。所以写个简单。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文件。
golang 用gorm生成module文件的更多相关文章
- Wix 安装部署(一)同MSBuild 自动生成打包文件
因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不同.我自己也在测试过程中,写下过程,以供参考.最新版本WiX Toolset v3.7,如何安装的就不说了, ...
- Wix 安装部署(一)同MSBuild 自动生成打包文件 转
原文地址:http://www.cnblogs.com/stoneniqiu/p/3355086.html 因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不 ...
- 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...
- webpack4 系列教程(十三):自动生成HTML文件
作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十三):自动生成 HTML 文件>原文地址.更欢迎来我的小站看更多原创内容:go ...
- pyx文件 生成pyd 文件用于 cython调用
转于:https://www.2cto.com/kf/201405/304168.html 1. 初衷 最近学用python,python不愧是为程序员考虑的编程语言,写起来很快很方便,大大节省开发效 ...
- Yii2用Gii自动生成Module+Model+CRUD
1. 开启gii模块 common/config/main-local.php加入下面代码 return [ 'modules' => [ 'gii' => [ 'class' => ...
- Python中使用dom模块生成XML文件示例
在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件. 在生成XML文件中,我们主 ...
- Python:Dom生成XML文件(写XML)
http://www.ourunix.org/post/327.html 在python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文 ...
- PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换
本篇文章主要介绍了PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换 超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软件准备 软 ...
- webpack中使用html-webpack-plugin生成HTML文件并主动插入css和js引入标签
html-webpack-plugin clean-webpack-plugin 一.html-webpack-plugin 由于打包时生成的css样式文件和js脚本文件会采用hash值作为文件命名的 ...
随机推荐
- 一类(One-Class)分类器
本文摘自博客和论文,参考文献请看文末. 一类分类技术概念 与传统的分类技术不同,一类分类技术仅采用隶属于一个类别的样本来训练分类器,其通常被用于某种极端场景,即训练样本仅包含正常样本,而异常样本不可得 ...
- c++代码实现中时间复杂度的不断优化
先来介绍一下时间复杂度: 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定量描述了该 ...
- 定时任务,LocalDateTime,在代码中调用其他项目的接口url
1.定时任务 1.在类上添加注解 @Component @Configuration @EnableScheduling 2.在类中方法上添加注解 @Scheduled(cron = "0 ...
- KingbaseES恢复被删除数据
KingbaseES恢复被删除数据 生产环境操作请先备份整个data目录或cp 当前数据目录/home/kingbase/pg_data到新的data目录,然后在备份的data目录进行恢复被删除数据操 ...
- IDEA手动导入jar包到maven本地库
第一步:下载需要的jar包 第二步:file project structure-liberaries 第三步:点击+号-选择java,再选择刚才下载的jar包,ok 此时我们把jar包加到项目了,但 ...
- 谈谈Selenium中的三种切换之alert
谈谈Selenium中的三种切换之alert 一.如何识别 识别方法:alert中的确定.取消.输入框无法用inspector定位到,当然还有一些特例. alert分为三种 alert confirm ...
- STM32F4寄存器串口DMA汇总
1.初始化 //RCC RCC->APB1ENR|=1<<20; //使能串口5时钟 RCC->APB1ENR|=1<<19; //使能串口4时钟 RCC-> ...
- STM32F4寄存器初始化系列:GPIO
1 static void GPIO_Init(void) 2 { 3 4 //sound 5 GPIO_Set(GPIOB,PIN4,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO ...
- Spring(Spring的静态工厂方法-动态工厂方法)
Spring的工厂方法: IoC通过工厂模式创建bean对线有两种方式: 静态工厂模式 实例工厂模式 区别在与:静态工厂不需要实例化,实例工厂需要实例化 1.静态工厂 实体类Car package c ...
- Redux Toolkit 的使用方法
Redux Toolkit 是什么? Redux Toolkit 是 Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集.它旨在成为标准的 Redux 逻辑开发模式,我们强烈建议你 ...