一、根据表结构生成结构体
types := map[string]string{
`数据库和go的类型对比
id BIGINT int64
name VARCHAR string
password VARCHAR string
sex TINYINT int/bool
birthday DATER time.Time
addr TEXT string
tel VARCHAR string
xxx VARCHAR string
`
"BIGINT":"int64"
"VARCHAR":"string"
"TEXT":"string"
"DATE":"time.Time"
"TINYINT":"bool"
}
func main(){
driverName:="mysql"
dsn := "user:password@protocol(host:prot)/dbname?charset=utf8mb4&loc=Local&parseTime=true" // data store name 数据库连接信息,使用协议,用户&密码,数据库,连接参数
db,err := sql.Open(driverName,dsn) //打开数据库
fmt.Println(db,err)
if err !=nil{
fmt.Println(err)
return
}
defer db.Close()
err = db.Ping()
// 操作
rows,err :=db.Query("show tables;") //查询所有表名,只有一列
if err !=nil{
fmt.Println(err)
return
}
defer rows.Close()
for rows.Next(){
var tablename string
err:=rows.Scan(&tableName) //查询tablename这一列
if err !=nil{
fmt.Println(err)
break
} else {
fieldSQL := fmt.Sprintf("select * from %s",tableName)
fieldrows,err:=db.Query(fieldSQL)
fmt.Println(tableName)
if err !=nil{
fmt.Println(tableName,err)
} else {
columns,err:=fieldRows.ColumnTypes()
if err != nil{
fmt.Println(err)
} else{
fmt.Println("********")
fmt.Println(tableName)
file,_:=os.Create(fmt.Sprintf("%s.go",tableName))
fmt.Fprintf(file, "type %s struct {\n}")
for _,column := range columns {
fmt.Println("\t",column.Name(),types[column.DatabaseTypeName()])
}
fmt.Fprintf(file,"}")
}
}
fieldrows.Close()
}
}
var id int 64
err := db.QueryRow("select id from user").Scan(&id) //使用Scan方法直接查询某列值
}
sql.Rows下有一个ColumnTypes方法,可以使用 go doc 查询
文档更新时间: 2023-04-02 09:57 作者:张尚