一、根据表结构生成结构体

  1. types := map[string]string{
  2. `数据库和go的类型对比
  3. id BIGINT int64
  4. name VARCHAR string
  5. password VARCHAR string
  6. sex TINYINT int/bool
  7. birthday DATER time.Time
  8. addr TEXT string
  9. tel VARCHAR string
  10. xxx VARCHAR string
  11. `
  12. "BIGINT":"int64"
  13. "VARCHAR":"string"
  14. "TEXT":"string"
  15. "DATE":"time.Time"
  16. "TINYINT":"bool"
  17. }
  18. func main(){
  19. driverName:="mysql"
  20. dsn := "user:password@protocol(host:prot)/dbname?charset=utf8mb4&loc=Local&parseTime=true" // data store name 数据库连接信息,使用协议,用户&密码,数据库,连接参数
  21. db,err := sql.Open(driverName,dsn) //打开数据库
  22. fmt.Println(db,err)
  23. if err !=nil{
  24. fmt.Println(err)
  25. return
  26. }
  27. defer db.Close()
  28. err = db.Ping()
  29. // 操作
  30. rows,err :=db.Query("show tables;") //查询所有表名,只有一列
  31. if err !=nil{
  32. fmt.Println(err)
  33. return
  34. }
  35. defer rows.Close()
  36. for rows.Next(){
  37. var tablename string
  38. err:=rows.Scan(&tableName) //查询tablename这一列
  39. if err !=nil{
  40. fmt.Println(err)
  41. break
  42. } else {
  43. fieldSQL := fmt.Sprintf("select * from %s",tableName)
  44. fieldrows,err:=db.Query(fieldSQL)
  45. fmt.Println(tableName)
  46. if err !=nil{
  47. fmt.Println(tableName,err)
  48. } else {
  49. columns,err:=fieldRows.ColumnTypes()
  50. if err != nil{
  51. fmt.Println(err)
  52. } else{
  53. fmt.Println("********")
  54. fmt.Println(tableName)
  55. file,_:=os.Create(fmt.Sprintf("%s.go",tableName))
  56. fmt.Fprintf(file, "type %s struct {\n}")
  57. for _,column := range columns {
  58. fmt.Println("\t",column.Name(),types[column.DatabaseTypeName()])
  59. }
  60. fmt.Fprintf(file,"}")
  61. }
  62. }
  63. fieldrows.Close()
  64. }
  65. }
  66. var id int 64
  67. err := db.QueryRow("select id from user").Scan(&id) //使用Scan方法直接查询某列值
  68. }

sql.Rows下有一个ColumnTypes方法,可以使用 go doc 查询

文档更新时间: 2023-04-02 09:57   作者:张尚