go语言学习项目篇-Mysql_Markdown(4)语法完结篇
MySQL数据库表生成Markdown工具
业务描述
输入 :
输出 :
扫描输入库名的所有表生成如下格式的Markdown文档
#* 表名 *(*表备注*)*
字段名 | 字段类型 | 是否为空 | 备注
‐‐‐|‐‐‐|‐‐‐|‐‐‐
id | int | N | 主键
name | varchar(20) | N | 用户名
首先 拿到一个问题 先分析需要用到的功能:
2.输入库名,将该库名下所有表生成格式为Markdown格式的文档
2.1 输入
2.2 获取表
2.3 按md格式生成
分析完需求,开始寻找第一步如何使用go语言连接数据库?
1.GORM操控数据库
经过GORM操纵数据库的学习,我们通过GORM的最新文档实现了增删改查的操作,GORM更新后是真的又灵活,又好用,又通俗易懂。
2.开始设计工具
1.获取information_schema的所有内容
2.循环遍历按格式输出。
格式:
#* 表名 *(*表备注*)*
字段名 | 字段类型 | 是否为空 | 备注
‐‐‐|‐‐‐|‐‐‐|‐‐‐
id | int | N | 主键
name | varchar(20) | N | 用户名
问题:
在使用GORM的时候,无一例外的都是需要一个结构体的,在这个结构体上创建table表往里面加内容,然后查询。
具体操作:
1.columns表
columns表提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname(数据库名).tablename(表名)的结果取之此表。
2.tables表
tables表提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from db_ca_ods;【注db_ca_ods为数据库名】的结果取之此表。
方法已经出来了:
SELECT table_name,table_comment FROM tables WHERE table_schema = 'study'
table_schema就是数据库名 table_name就是表名
设计思路:
1.创建2个结构体
type tableInfo struct {
Name string '表名'
Comment string '表备注'
//这里用语法把除information_schema,mysql,performance_chema的table_schema的其他数据库打印出来就是全部的表.
}
type tableColumn struct {
ColumnName string '字段名' //
Columntype string '字段类型'
IsNullable string '是否为空'
Extra string '备注'
}
2.数据库连接(这里就得连接information_schema这个数据库)
3.然后使用GORM中的IS NOT 来输出除默认数据库的所有库中的表.格式按照tableColum结构体来输出 .
按(md格式)输出语法 :
fmt.printf("#* %s *(*%s*)*" ,Name,Comment)
fmt.printf("字段名 | 字段类型 | 是否为空 | 备注 \n‐‐‐|‐‐‐|‐‐‐|‐‐‐ \n|%s|%s|%s|%s",ColumnName,Columntype,IsNullable,Extra)
4.把输出的文字保存成md后缀的文件,保存在指定位置.
5.至于其他格式的文件,可以使用typora这个软件自动转码,方便快捷,如果想要WORD格式的,就百度搜索word格式标准,改一下输出格式就行了,不过发现还是md最好用哦,typora什么格式都能转了.
这是思路,具体写下来是这样的:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
/* *
Structed Query language
*/
const (
sqlTables="SELECT table_name AS name,table_comment AS comment from tables WHERE table_schema=?"
sqlColumns="SELECT column_name AS ColumnName,column_type AS ColumnType,is_nullable AS IsNullable,column_comment AS ColumnComment from columns WHERE table_schema=? AND table_name=?"
)
/* *
Struct for tables
*/
type tableInfo struct {
Name string `table_name` //表名
Comment string `table_comment` //表备注
}
/* *
Struct for columns
*/
type tableColumn struct {
ColumnName string `column_name` //字段名
ColumnType string `column_type` //字段类型
IsNullable string `is_nullable` //是否为空
ColumnComment string `column_comment` //备注
}
/* *
main func
*/
func main() {
//Query Mysql_User_Message
var username string
var pwd string
var database string
fmt.Println("数据库默认的hose:127.0.0.1 port:3306 charset=utf8mb4")
fmt.Println("请输入要连接的mysql数据库的账户(默认: root):")
fmt.Scan(&username)
fmt.Println("请输入要连接的mysql数据库的密码(默认: 123456):")
fmt.Scan(&pwd)
fmt.Println("请输入要使用的数据库:")
fmt.Scan(&database)
//Connect Mysql Service
dsn := fmt.Sprintf("%s:%s@tcp(127.0.0.1:3306)/information_schema?charset=utf8mb4&parseTime=True&loc=Local",username,pwd)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
tableCollect :=[]tableInfo{}
columnCollect :=[]tableColumn{}
//Query tableInfo
db.Raw(sqlTables,database).Scan(&tableCollect)
for _, value := range tableCollect{
if value.Comment ==""{
value.Comment="无信息"
}
//Query tableColumn
db.Raw(sqlColumns,database,value.Name).Scan(&columnCollect)
//Markdown Head
fmt.Printf("# * %v *(* %v *)* \n", value.Name,value.Comment)
fmt.Println("| 字段名 | 字段类型 | 是否为空 | 备注 |")
fmt.Println("| ------ | ------- | --------| ------ |")
for _, value1 := range columnCollect{
if value1.ColumnComment ==""{
value1.ColumnComment="无信息"
}
fmt.Printf("| %v | %v | %v | %v |\n",value1.ColumnName,value1.ColumnType,value1.IsNullable,value1.ColumnComment)
}
fmt.Println("")
}
}
学习历程:
看前面,打印出来直接就是Markdown的格式.这里还并不完善,可以更人性化,接下来的步骤是如何让连接的数据库输出的字符保存成后缀为md的文档,把输出的内容以txt的格式存为md的文档这才算是完成.不过到这里语法已经完成了.
接下来的就是优化和讲解了,先把源代码放这里.下一步就是完结篇.真的是不要问,这个是为什么?代码都在上面,功能实现完毕.这个小工具想来真的很实用啊.......打开navicat一个个看真的很麻烦,直接打印成表,看起来舒服多了.
看起来代码量很少对吧,花了很多心思,需求不难,逻辑结构也不难,难在什么呢???????????
难在如何用go语言去实现这个功能啊!!!!!!!!!!!!!!!!!!!!!由于网上没教程,自己通过原来做的笔记,一点点根据需求弄出来了.