golang获取mysql表结构_Golang 获取MySQL表元信息

本文详细介绍了如何使用Golang的database/sql包和Mysql驱动来操作数据库,特别是展示了如何获取MySQL的表信息和字段信息,包括查询数据库中的表和表字段的SQL语句,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golang 获取MySQL表元信息

本文介绍Golang如何操作数据库,并通过获取Mysql表元信息进行实例演示。

1. Golang 操作DBMS

Golang 通过标准database/sql包实现了对关系型数据库很好的支持,如MySQL, MS SQL Server, Oracle 和 Postgres,当然NoSql也没有问题,如MongoDB、Redis。

使用Golang标准库可以很容易与Mysql交互,其他数据库也一样,可以参加Golang数据库驱动列表。

SQL标准库提供通用接口及常用方法用于访问或操作数据库。数据库包包括连接池,正确使用可确保线程安全。数据库包必须和具体数据库驱动包一起使用。

2. 连接Mysql

连接Mysql需要使用标准SQL包和Mysql驱动,Mysql驱动包实现标准包方法和接口。一般实现SQl标准包通常通过标准包暴露驱动接口,入口点代码在SQL驱动的Go文件。

SQL包是存在于Go标准库中的标准SQL包。因为init()函数是在任何其他函数之前执行的,所以可以肯定的是,只要在代码中包含了MySQL包,则Mysql驱动会被自动注册并通过标准SQL包调用。

import (

"database/sql"

"fmt"

_ "github.com/go-sql-driver/mysql"

)

这里下划线_表示载入包但不直接使用,我们通过标准SQL包使用。没有下划线,编译器会提示导入没有使用错误。

加载包的动作即使是静态方式,但包中的init()方法仍会执行,初始化方法会注册Mysql驱动给标准包,从而使用对标准包的方法调用转为对具体Mysql实现的方法调用。

为了数据库处理对象可以重用,定义全局数据库处理指针:

var db *sql.DB

与数据库交互的第一个函数是sql.Open(),获取数据库对象,用于执行查询和命令。第一个参数指定数据库驱动,这里是mysql。第二个参数是连接字符串。

db, err = sql.Open("mysql", "root:pass123@/sakila?charset=utf8&parseTime=true")

sql.Open()函数返回数据库连接处理器,用于对数据库执行查询和命令。同时返回错误对象,没有错误则为nil。

连接字符串包括用户名和密码,这里还指定字符集和解析时间类型,完整内容请参考官网。

在init方法中调用Open方法:

func init() {

db, err = sql.Open("mysql", "root:a123@/sakila?charset=utf8&parseTime=true")

checkErr(err)

}

检查错误方法:

func checkErr(err error) {

if err != nil {

panic(err)

}

}

3. 获取Mysql数据库元信息

获取元信息主要包括获取数据库中表信息以及表的字段信息。从INFORMATION_SCHEMA.TABLES表中查询表信息:

SELECT table_name name,IFNULL(TABLE_COMMENT,table_name) value

FROM INFORMATION_SCHEMA.TABLES

WHERE UPPER(table_type)='BASE TABLE'

AND LOWER(table_schema) = 'sakila'

ORDER BY table_name asc;

获取表字段信息,从information_schema.columns表查询字段信息:

SELECT COLUMN_NAME fName,column_comment fDesc,DATA_TYPE dataType,

IS_NULLABLE isNull,IFNULL(CHARACTER_MAXIMUM_LENGTH,0) sLength

FROM information_schema.columns

WHERE table_schema = 'sakila' AND table_name = 'actor';

3.1. 查询数据库表信息

使用?作为参数占位符,db.Query()执行查询,参数为SQL字符串和数据库名。

func TableInfo(dbName string) map[string]string {

sqlStr := `SELECT table_name tableName,TABLE_COMMENT tableDesc

FROM INFORMATION_SCHEMA.TABLES

WHERE UPPER(table_type)='BASE TABLE'

AND LOWER(table_schema) = ?

ORDER BY table_name asc`

var result = make(map[string]string)

rows, err := db.Query(sqlStr,dbName)

checkErr(err)

for rows.Next() {

var tableName,tableDesc string

err = rows.Scan(&tableName, &tableDesc)

checkErr(err)

if len(tableDesc) == 0 {

tableDesc = tableName

}

result[tableName] = tableDesc

}

return result

}

遍历查询结果,数据库名称和注释信息作为键值对存储在Map中。

3.2. 查询表字段信息

定义FieldInfo函数,参数为数据库名和表名,返回Field类型切片,我们首先看Field结构体:

type Field struct {

fieldName string

fieldDesc string

dataType string

isNull string

length int

}

查询字段函数FieldInfo():

func FieldInfo(dbName,tableName string) [] Field{

sqlStr := `SELECT COLUMN_NAME fName,column_comment fDesc,DATA_TYPE dataType,

IS_NULLABLE isNull,IFNULL(CHARACTER_MAXIMUM_LENGTH,0) sLength

FROM information_schema.columns

WHERE table_schema = ? AND table_name = ?`

var result [] Field

rows, err := db.Query(sqlStr,dbName,tableName)

checkErr(err)

for rows.Next() {

var f Field

err = rows.Scan(&f.fieldName, &f.fieldDesc, &f.dataType, &f.isNull, &f.length)

checkErr(err)

result = append(result, f)

}

return result

}

3.3. 测试

下面在main函数中进行测试:

func main() {

defer db.Close()

tableInfo := TableInfo("sakila")

fmt.Println(tableInfo)

filedInfo := FieldInfo("sakila","actor")

for _,item := range filedInfo {

fmt.Println(item)

}

}

defer db.Close()语句确保执行完毕后关闭数据库连接。

4. 总结

本文介绍了标准database/sql包及Mysql驱动,最后通过获取Mysql表元信息示例说明如何执行数据库操作。

作者: neweastsun

链接: https://blog.youkuaiyun.com/neweastsun/article/details/105903711

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

到此这篇关于“Golang 获取MySQL表元信息”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!

相关文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值