当前位置: 七九推 > 网络运营>服务器>Linux > Go实现简单的数据库表转结构体详解

Go实现简单的数据库表转结构体详解

2023年01月13日 Linux 我要评论
前言码上源码package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""strings")/** 自动将表生成

前言

码上源码

package main
import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"strings"
)
/**
  自动将表生成 model结构,
 通过创建数据库连接,读取数据库的所有表并对所有的表元数据封装转化实体结构体
*/
type schemameta struct {
	field   string
	type    string
	null    string
	key     string
	default interface{}
	extra   string
}
func main() {
	dbstring := "{your_mysql_connection}"
	db, _ := sql.open("mysql", dbstring)
	tables := gettables(db)
	for _, table := range tables {
		metas := gettableinfo(table, db)
		result := changemetas(table, metas)
		fmt.println(result)
	}
}
func gettables(db *sql.db) []string {
	var tables []string
	res, _ := db.query("show tables")
	for res.next() {
		var table string
		res.scan(&table)
		tables = append(tables, table)
	}
	return tables
}
func gettableinfo(tablename string, db *sql.db) (metas []schemameta) {
	list, _ := db.query(fmt.sprintf("show columns from %s", tablename))
	for list.next() {
		var data schemameta
		err := list.scan(&data.field, &data.type, &data.null, &data.key, &data.default, &data.extra)
		if err != nil {
			fmt.println(err.error())
		}
		metas = append(metas, data)
	}
	return metas
}
func changemetas(tablename string, metas []schemameta) string {
	var modelstr string
	for _, val := range metas {
		datatype := "interface{}"
		if val.type[:3] == "int" {
			datatype = "int"
		} else if val.type[:7] == "varchar" {
			datatype = "string"
		} else if val.type[:7] == "tinyint" {
			datatype = "bool"
		} else if val.type == "datetime" {
			datatype = "time.time"
		}
		field := val.field
		field = strings.toupper(field[:1]) + field[1:]
		modelstr += fmt.sprintf("%s %s\n", field, datatype)
	}
	tablename = strings.toupper(tablename[:1]) + tablename[1:]
	return fmt.sprintf("type %s struct {\n %s }", tablename, modelstr)
}

设计好了数据库表之后最烦的就是又要在代码中建一层实体层然后一个个创建对应表的结构体。关键那么多项目每次都是需要创建一份,所以就使用 go 实现一个简单的将数据库的表转化为结构体。

基本的设计思路也是很简单:

  • 连接数据库
  • 获取数据库中所有的表
  • 获取表的所有的元数据
  • 将元数据转换为字符串,该字符串就是一个 struct的内容并输出结果

设计过程

经常使用 mysql 的时候,可以通过 sql 语句查询相关的信息,比如查看数据库的状态、数据库的数据表、数据库服务的状态等等语句。

show databases 查看所有的数据库
show tables [from dbname] 查看数据库的所有表数据
show columns from tablename [from dbname] 查看数据库表的所有元信息
show status 查看数据服务的状态

所以就可以使用以上的 sql 语句进行相操作,比如获取所有的表,获取相关表的元数据

func gettableinfo(tablename string, db *sql.db) (metas []schemameta) {
    list, _ := db.query(fmt.sprintf("show columns from %s", tablename))
    for list.next() {
        var data schemameta
        err := list.scan(&data.field, &data.type, &data.null, &data.key, &data.default, &data.extra)
        if err != nil {
            fmt.println(err.error())
        }
        metas = append(metas, data)
    }
    return metas
}

表的元数据获取完之后就可以进行封装成一个字符串。最主要的功能有两个:

  • db 数据类型转 go 数据类型
  • 首字母大小写,

数据类型的转换简单处理的话可以使用枚举的方式将 db 数据类型和 go 的数据类型建立一个map 进行一一对应,当然也可以使用模糊匹配的方式。我这里直接使用截取字符串值去匹配。

因要设置为对象类型,必须设置为公有的,所以结构体名称和字段名称都必须是大写。直接使用截取第一位然后进行大写转换再重新拼接出去。比如 field = strings.toupper(field[:1]) + field[1:]。这部分的数据大小写还需要根据自己的需求进行调整,比如有写字段是这样:“user_code”那么转换成字段应该是“usercode”。

转换完之后就可以输出,一个简单的工具就完成了。

迭代升级

  • 支持多种数据库:现目前使用的是 mysql 数据库进行开发,而市面上其实有很多种数据,所以这部分可以继续扩展支持多种数据库。
  • 数据类型转换:现只支持自己所使用的相关数据类型
  • 如果有前端搭配使用可以涉及按需生成

以上就是go实现简单的数据库表转结构体详解的详细内容,更多关于go数据库表转结构体的资料请关注七九推其它相关文章!

(0)
打赏 微信扫一扫 微信扫一扫

相关文章:

  • Linux命令之mkdir,cat,touch,vi/vim的详解

    mkdir命令语法linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。命令格式mkdir […

    2023年01月16日 服务器
  • Win11/10 Linux 子系统 WSL 1.1.0 预发布版开放下载

    Win11/10 Linux 子系统 WSL 1.1.0 预发布版开放下载

    微软今日在 github 上线了wsl 1.1.0 预发布版本,现可手动下载更新到 windows 11/10 的最新版 linux 子系统。微软没有列出 1.... [阅读全文]
  • Linux系统 第2节 虚拟机中安装Kali系统

    1 引言在课程的第一阶段开始时,主要介绍了windows相关版本在虚拟机中的安装和配置。此处作为相关配置的补充。在虚拟机中安装kali,将为本阶段进一步了解网络安全的攻防手段与原理…

    2022年12月30日 服务器
  • expect实现Linux自动登陆远程机器脚本实例

    expect实现Linux自动登陆远程机器脚本实例

    expect是由don libes基于tcl(tool command language )语言开发的,主要应用于自动化交互式操作的场景,借助expect处理交... [阅读全文]
  • Linux版本中Nginx平滑升级与回退

    Linux版本中Nginx平滑升级与回退

    一、平滑升级概述1.平滑升级的定义在进行服务版本升级的时候,对于用户访问体验无感知,不会造成服务中断。2.平滑升级的思路(1)关于版本和备份下载新版本nginx... [阅读全文]
  • 一次nginx崩溃事件的实战记录

    一、事件描述2023年春节复工第一天,项目组同事反馈说业务系统中图像处理代理nginx服务于1月23日发生崩溃,完成了重启操作,检查nginx的日志有如下报错:2023/01/23…

    2023年02月02日 服务器

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2023  七九推 保留所有权利. 粤ICP备17035492号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com