• Go语言入门心法(十二): GORM映射框架




    Go语言入门心法(一): 基础语法

    Go语言入门心法(二): 结构体

    Go语言入门心法(三): 接口

    Go语言入门心法(四): 异常体系

     Go语言入门心法(五): 函数

    Go语言入门心法(六): HTTP面向客户端|服务端编程

    Go语言入门心法(七): 并发与通道

    Go语言入门心法(八): mysql驱动安装报错onnection failed

    Go语言入门心法(九): 引入三方依赖

    Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理

    Go语言入门心法(十一): 文件处理

    Go语言入门心法(十二): GORM映射框架

    Go语言入门心法(十三): 反射认知升维




     一: ORM映射框架认知 


    安装依赖:

    S D:\program_file\go_workspace> go get   gorm.io/gorm
    PS D:\program_file\go_workspace> go get  gorm.io/driver/sqlite
    PS D:\program_file\go_workspace> go get  gorm.io/driver/mysql

    PS D:\program_file\go_workspace> go get  github.com/jinzhu/gorm
     


    二: 检查数据连接情况


    1. package main
    2. import (
    3. "github.com/jinzhu/gorm"
    4. _ "github.com/jinzhu/gorm/dialects/mysql"
    5. "log"
    6. )
    7. func main() {
    8. db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user?charset=utf8&parseTime=True&loc=Local")
    9. //延时关闭数据库连接
    10. defer db.Close()
    11. // 设置最大连接数
    12. db.DB().SetMaxOpenConns(100)
    13. // 设置最大闲置数据
    14. db.DB().SetMaxIdleConns(10)
    15. gormDatabaseLinkCheckErr(err)
    16. // 通过ping检查数量是否成功
    17. err = db.DB().Ping()
    18. gormDatabaseLinkCheckErr(err)
    19. log.Println("数据库连接成功! ")
    20. }
    21. // 定义结构体
    22. type gormUser struct {
    23. ID uint `json:"id"`
    24. Phone string `json:"phone"`
    25. Name string `json:"name"`
    26. Password string `json:"password"`
    27. }
    28. func gormDatabaseLinkCheckErr(err error) {
    29. if err != nil {
    30. log.Fatal("系统异常: ", err.Error())
    31. }
    32. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPGormToDatabaseGrammar_go.exe D:\program_file\go_workspace\org.jd.data\gorm\OOPGormToDatabaseGrammar.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPGormToDatabaseGrammar_go.exe
    2023/10/22 14:15:46 数据库连接成功! 

    Process finished with the exit code 0
     

    三: GORM使用结构体创建表


    1. package main
    2. /**
    3. gorm对象关系映射建表:sys_gorm_user
    4. */
    5. import (
    6. "fmt"
    7. "gorm.io/driver/mysql"
    8. "gorm.io/gorm"
    9. "log"
    10. "time"
    11. )
    12. func main() {
    13. db, err := gorm.Open(mysql.New(mysql.Config{
    14. DSN: "root:123456@tcp(127.0.0.1:3306)/tope-pay-user?charset=utf8&parseTime=True&loc=Local", // data source name
    15. DefaultStringSize: 256, // default size for string fields
    16. DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
    17. DontSupportRenameIndex: true, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
    18. DontSupportRenameColumn: true, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
    19. SkipInitializeWithVersion: false,
    20. }), &gorm.Config{
    21. DisableForeignKeyConstraintWhenMigrating: true,
    22. })
    23. sqlDB, err := db.DB()
    24. //延时关闭数据库连接
    25. defer sqlDB.Close()
    26. // 设置最大连接数
    27. // 设置最大闲置数据
    28. sqlDB.SetMaxIdleConns(10)
    29. sqlDB.SetConnMaxLifetime(time.Hour)
    30. gormDatabaseCreateTableCheckErr(err)
    31. // 通过ping检查数量是否成功
    32. err = sqlDB.Ping()
    33. gormDatabaseCreateTableCheckErr(err)
    34. log.Println("数据库连接成功! ")
    35. tx := db.Begin()
    36. // 如果表存在,则删除
    37. result := db.Migrator().HasTable(&GormUser{})
    38. if result {
    39. // 表存在先删除
    40. err = db.Migrator().DropTable(&GormUser{})
    41. if err != nil {
    42. log.Println("删除表异常: ", err.Error())
    43. } else {
    44. log.Println("\t表删除成功")
    45. }
    46. }
    47. // 创建表:gorm_users
    48. err = db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&GormUser{})
    49. if err != nil {
    50. // 事务回滚
    51. tx.Rollback()
    52. fmt.Println("事务回滚:", err.Error())
    53. }
    54. // 重命名列
    55. db.Migrator().RenameColumn(&GormUser{}, "id", "deptId")
    56. db.Migrator().RenameColumn(&GormUser{}, "CreatedAt", "createTime")
    57. db.Migrator().RenameColumn(&GormUser{}, "UpdatedAt", "updateTime")
    58. db.Migrator().RenameColumn(&GormUser{}, "DeletedAt", "deleted")
    59. db = tx.Commit()
    60. err = db.Error
    61. if err != nil {
    62. log.Println("系统异常:", err.Error())
    63. return
    64. }
    65. log.Println("\t执行建表成功")
    66. }
    67. // GormUser 定义结构体
    68. type GormUser struct { // 约定主键为ID才会自动创建,数据库的主键为id,二不是解析的deptId,但可用在创建之后通过重命名的方式修改列名
    69. gorm.Model
    70. ID int64 `json:"deptId" gorm:"primaryKey;autoIncrement:true,unique"`
    71. Phone string `json:"phone" gorm:"size:11,unique,index:idx_phone"`
    72. Name string `json:"name" gorm:"size:50,index:idx_name"`
    73. Password string `json:"password" gorm:"size:100"`
    74. }
    75. func gormDatabaseCreateTableCheckErr(err error) {
    76. if err != nil {
    77. log.Fatal("系统异常: ", err.Error())
    78. return
    79. }
    80. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_gorm__1_.exe D:\program_file\go_workspace\org.jd.data\gorm\OOPGormToDatabaseGrammarCreateTable.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_gorm__1_.exe
    2023/10/22 21:16:13 数据库连接成功!
    2023/10/22 21:16:13     表删除成功
    2023/10/22 21:16:13     执行建表成功

    Process finished with the exit code 0


    四: Gorm对象关系映射插入数据


    1. package main
    2. import (
    3. "gorm.io/driver/mysql"
    4. "gorm.io/gorm"
    5. "log"
    6. "time"
    7. )
    8. /*
    9. 插入单条数据
    10. */
    11. func main() {
    12. db, err := gorm.Open(mysql.New(mysql.Config{
    13. DSN: "root:123456@tcp(127.0.0.1:3306)/tope-pay-user?charset=utf8&parseTime=True&loc=Local", // data source name
    14. DefaultStringSize: 256, // default size for string fields
    15. DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
    16. DontSupportRenameIndex: false, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
    17. DontSupportRenameColumn: false, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
    18. SkipInitializeWithVersion: false,
    19. }), &gorm.Config{
    20. DisableForeignKeyConstraintWhenMigrating: false,
    21. })
    22. sqlDB, err := db.DB()
    23. //延时关闭数据库连接
    24. defer sqlDB.Close()
    25. // 设置最大连接数
    26. // 设置最大闲置数据
    27. sqlDB.SetMaxIdleConns(10)
    28. // 最大连接数
    29. sqlDB.SetMaxOpenConns(100)
    30. sqlDB.SetConnMaxLifetime(time.Hour)
    31. gormDatabaseInsertCheckErr(err)
    32. // 通过ping检查数量是否成功
    33. err = sqlDB.Ping()
    34. gormDatabaseInsertCheckErr(err)
    35. log.Println("数据库连接成功! ")
    36. println()
    37. tx := db.Begin() // 开启事务
    38. user := &GormUser{Name: "张三", Phone: "15910771022", Password: "123456", CreateTime: time.Now(), UpdateTime: time.Now(), Deleted: time.Now()}
    39. result := db.Create(&user)
    40. err = result.Error
    41. if err != nil {
    42. tx.Rollback() // 回滚事务
    43. println("插入数据异常,已回滚事务.......")
    44. }
    45. result = tx.Commit() // 提交事务
    46. err = result.Error
    47. if err != nil {
    48. log.Fatal("系统异常: ", err.Error())
    49. return
    50. }
    51. println("============================插入数据成功=======================================")
    52. }
    53. type GormUser struct {
    54. deptId int64 `json:"deptId"` //
    55. Phone string `json:"phone"` //
    56. Name string `json:"name"` //
    57. Password string `json:"password"` //
    58. CreateTime time.Time `json:"createTime" gorm:"column:createTime"` // gorm 的column:映射数据库中对应列的字段为createTime
    59. UpdateTime time.Time `json:"updateTime" gorm:"column:updateTime"` //
    60. Deleted time.Time `json:"deleted" gorm:"column:deleted"` //
    61. }
    62. func gormDatabaseInsertCheckErr(err error) {
    63. if err != nil {
    64. log.Fatal("系统异常: ", err.Error())
    65. return
    66. }
    67. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPGormToDatabaseGrammarInsert_go.exe D:\program_file\go_workspace\org.jd.data\gorm\insert\OOPGormToDatabaseGrammarInsert.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPGormToDatabaseGrammarInsert_go.exe
    2023/10/23 12:25:10 数据库连接成功!

    ============================插入数据成功=======================================


    五: Gorm批量插入数据


    1. package main
    2. import (
    3. "gorm.io/driver/mysql"
    4. "gorm.io/gorm"
    5. "log"
    6. "time"
    7. )
    8. func main() {
    9. db, err := gorm.Open(mysql.New(mysql.Config{
    10. DSN: "root:123456@tcp(127.0.0.1:3306)/tope-pay-user?charset=utf8&parseTime=True&loc=Local", // data source name
    11. DefaultStringSize: 256, // default size for string fields
    12. DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
    13. DontSupportRenameIndex: false, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
    14. DontSupportRenameColumn: false, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
    15. SkipInitializeWithVersion: false,
    16. }), &gorm.Config{
    17. DisableForeignKeyConstraintWhenMigrating: false,
    18. })
    19. sqlDB, err := db.DB()
    20. //延时关闭数据库连接
    21. defer sqlDB.Close()
    22. // 设置最大连接数
    23. // 设置最大闲置数据
    24. sqlDB.SetMaxIdleConns(10)
    25. // 最大连接数
    26. sqlDB.SetMaxOpenConns(100)
    27. sqlDB.SetConnMaxLifetime(time.Hour)
    28. gormDatabaseBatchInsertCheckErr(err)
    29. // 通过ping检查数量是否成功
    30. err = sqlDB.Ping()
    31. gormDatabaseBatchInsertCheckErr(err)
    32. log.Println("数据库连接成功! ")
    33. println()
    34. tx := db.Begin() // 开启事务
    35. var users = []GormUser{{Name: "张三", Phone: "15910771022", Password: "123456", CreateTime: time.Now(), UpdateTime: time.Now(), Deleted: time.Now()},
    36. {Name: "张三", Phone: "15910771022", Password: "123456", CreateTime: time.Now(), UpdateTime: time.Now(), Deleted: time.Now()},
    37. {Name: "李四", Phone: "15910771022", Password: "123456", CreateTime: time.Now(), UpdateTime: time.Now(), Deleted: time.Now()},
    38. {Name: "王五", Phone: "15910771022", Password: "123456", CreateTime: time.Now(), UpdateTime: time.Now(), Deleted: time.Now()},
    39. {Name: "赵四", Phone: "15910771022", Password: "123456", CreateTime: time.Now(), UpdateTime: time.Now(), Deleted: time.Now()},
    40. {Name: "王二麻子", Phone: "15910771022", Password: "123456", CreateTime: time.Now(), UpdateTime: time.Now(), Deleted: time.Now()}}
    41. result := db.CreateInBatches(users, 100)
    42. err = result.Error
    43. if err != nil {
    44. tx.Rollback() // 回滚事务
    45. println("插入数据异常,已回滚事务.......")
    46. }
    47. result = tx.Commit() // 提交事务
    48. err = result.Error
    49. if err != nil {
    50. log.Fatal("系统异常: ", err.Error())
    51. return
    52. }
    53. println("============================批量插入数据成功=======================================")
    54. }
    55. type GormUser struct {
    56. deptId int64 `json:"deptId"` //
    57. Phone string `json:"phone"` //
    58. Name string `json:"name"` //
    59. Password string `json:"password"` //
    60. CreateTime time.Time `json:"createTime" gorm:"column:createTime"` // gorm 的column:映射数据库中对应列的字段为createTime
    61. UpdateTime time.Time `json:"updateTime" gorm:"column:updateTime"` //
    62. Deleted time.Time `json:"deleted" gorm:"column:deleted"` //
    63. }
    64. func gormDatabaseBatchInsertCheckErr(err error) {
    65. if err != nil {
    66. log.Fatal("系统异常: ", err.Error())
    67. return
    68. }
    69. }

     运行效果:


    rogram_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_gorm_batch.exe org.jd.data/org.jd.data/gorm/batch #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_gorm_batch.exe
    2023/10/23 12:45:15 数据库连接成功!

    ============================批量插入数据成功=======================================

    Process finished with the exit code 0


     

    六: Gorm查询数据


    1. package main
    2. import (
    3. "fmt"
    4. "gorm.io/driver/mysql"
    5. "gorm.io/gorm"
    6. "log"
    7. "time"
    8. )
    9. func main() {
    10. db, err := gorm.Open(mysql.New(mysql.Config{
    11. DSN: "root:123456@tcp(127.0.0.1:3306)/tope-pay-user?charset=utf8&parseTime=True&loc=Local", // data source name
    12. DefaultStringSize: 256, // default size for string fields
    13. DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
    14. DontSupportRenameIndex: false, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
    15. DontSupportRenameColumn: false, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
    16. SkipInitializeWithVersion: false,
    17. }), &gorm.Config{
    18. DisableForeignKeyConstraintWhenMigrating: false,
    19. })
    20. sqlDB, err := db.DB()
    21. //延时关闭数据库连接
    22. defer sqlDB.Close()
    23. // 设置最大连接数
    24. // 设置最大闲置数据
    25. sqlDB.SetMaxIdleConns(10)
    26. // 最大连接数
    27. sqlDB.SetMaxOpenConns(100)
    28. sqlDB.SetConnMaxLifetime(time.Hour)
    29. gormDatabaseInsertCheckErr(err)
    30. // 通过ping检查数量是否成功
    31. err = sqlDB.Ping()
    32. gormDatabaseInsertCheckErr(err)
    33. log.Println("数据库连接成功! ")
    34. println()
    35. var users []GormUser
    36. // Get all records SELECT * FROM gorm_users ;
    37. doResult := db.Find(&users)
    38. err = doResult.Error // returns error
    39. gormDatabaseInsertCheckErr(err)
    40. rowCount := doResult.RowsAffected // returns found records count, equals `len(gorm_users)`
    41. fmt.Printf("获取多少 %d 条数据\n", rowCount)
    42. println("=============================条件查询====================================")
    43. // IN
    44. rowCountNum := db.Where("name IN ?", []string{"张三", "李四", "王五"}).Find(&users)
    45. // SELECT * FROM gorm_users WHERE name IN ('张三','李四', "王五");
    46. fmt.Printf("查找到 %d 条数据\n", rowCountNum.RowsAffected)
    47. println("=============================模糊查询====================================")
    48. // LIKE
    49. rowCountNum = db.Where("name LIKE ?", "%李%").Find(&users)
    50. // SELECT * FROM gorm_users WHERE name LIKE '%李%';
    51. fmt.Printf("查找到 %d 条数据\n", rowCountNum.RowsAffected)
    52. }
    53. type GormUser struct {
    54. deptId int64 `json:"deptId"` //
    55. Phone string `json:"phone"` //
    56. Name string `json:"name"` //
    57. Password string `json:"password"` //
    58. CreateTime time.Time `json:"createTime" gorm:"column:createTime"` // gorm 的column:映射数据库中对应列的字段为createTime
    59. UpdateTime time.Time `json:"updateTime" gorm:"column:updateTime"` //
    60. Deleted time.Time `json:"deleted" gorm:"column:deleted"` //
    61. }
    62. func gormDatabaseInsertCheckErr(err error) {
    63. if err != nil {
    64. log.Fatal("系统异常: ", err.Error())
    65. return
    66. }
    67. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_gorm_query.exe org.jd.data/org.jd.data/gorm/query #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_gorm_query.exe
    2023/10/23 13:29:18 数据库连接成功!

    获取多少 39 条数据
    =============================条件查询====================================
    查找到 27 条数据
    =============================模糊查询====================================
    查找到 6 条数据

    Process finished with the exit code 0

    七: Gorm更新数据


    1. package main
    2. import (
    3. "fmt"
    4. "gorm.io/driver/mysql"
    5. "gorm.io/gorm"
    6. "log"
    7. "time"
    8. )
    9. func main() {
    10. db, err := gorm.Open(mysql.New(mysql.Config{
    11. DSN: "root:123456@tcp(127.0.0.1:3306)/tope-pay-user?charset=utf8&parseTime=True&loc=Local", // data source name
    12. DefaultStringSize: 256, // default size for string fields
    13. DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
    14. DontSupportRenameIndex: false, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
    15. DontSupportRenameColumn: false, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
    16. SkipInitializeWithVersion: false,
    17. }), &gorm.Config{
    18. DisableForeignKeyConstraintWhenMigrating: false,
    19. })
    20. sqlDB, err := db.DB()
    21. //延时关闭数据库连接
    22. defer sqlDB.Close()
    23. // 设置最大连接数
    24. // 设置最大闲置数据
    25. sqlDB.SetMaxIdleConns(10)
    26. // 最大连接数
    27. sqlDB.SetMaxOpenConns(100)
    28. sqlDB.SetConnMaxLifetime(time.Hour)
    29. gormDatabaseInsertCheckErr(err)
    30. // 通过ping检查数量是否成功
    31. err = sqlDB.Ping()
    32. gormDatabaseInsertCheckErr(err)
    33. log.Println("数据库连接成功! ")
    34. println()
    35. println("============================================开始更新数据===============================")
    36. tx := db.Begin() // 开启事务
    37. // Update with conditions 更新单列数据
    38. result := db.Model(&GormUser{}).Where("name = ?", "李四").Update("name", "老高")
    39. rowCount := result.RowsAffected
    40. fmt.Printf("受影响的行数 %d 条\n", rowCount)
    41. err = result.Error
    42. if err != nil {
    43. tx.Rollback() // 回滚事务
    44. println("更新数据异常,已回滚事务.......")
    45. }
    46. result = tx.Commit() // 提交事务
    47. err = result.Error
    48. if err != nil {
    49. log.Fatal("系统异常: ", err.Error())
    50. return
    51. }
    52. println("=======================================数据更新成功=======================================")
    53. }
    54. type GormUser struct {
    55. deptId int64 `json:"deptId"` //
    56. Phone string `json:"phone"` //
    57. Name string `json:"name"` //
    58. Password string `json:"password"` //
    59. CreateTime time.Time `json:"createTime" gorm:"column:createTime"` // gorm 的column:映射数据库中对应列的字段为createTime
    60. UpdateTime time.Time `json:"updateTime" gorm:"column:updateTime"` //
    61. Deleted time.Time `json:"deleted" gorm:"column:deleted"` //
    62. }
    63. func gormDatabaseInsertCheckErr(err error) {
    64. if err != nil {
    65. log.Fatal("系统异常: ", err.Error())
    66. return
    67. }
    68. }

    运行效果:


    GOROOT=D:\program_file_worker\go1.20 #gosetup
    GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
    D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPGormToDatabaseGrammarUpdate_go.exe D:\program_file\go_workspace\org.jd.data\gorm\update\OOPGormToDatabaseGrammarUpdate.go #gosetup
    C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPGormToDatabaseGrammarUpdate_go.exe
    2023/10/23 13:42:11 数据库连接成功!

    ============================================开始更新数据===============================
    受影响的行数 6 条
    =======================================数据更新成功=======================================

    Process finished with the exit code 0

     更多详细操作查看官方文档:

    Gorm对象关系映射详细文档

  • 相关阅读:
    初级算法_字符串 --- 有效的字母异位词
    2022 IDEA (学生邮箱认证)安装使用教程以及基础配置教程
    高德地图JSAPI 2.0使用Java代码代替Nginx进行反向代理
    SAP中的BOPF(Business Object Processing Framework)
    红帽Linux的安装和部署
    服务器怎么关闭防火墙
    腾讯云 Cloud Studio 实战训练:快速构建React完成H5页面还原
    MyBatisPlus(十二)排序查询:orderBy
    labelme安装
    SpringCloudAliBaba(四)之Feign介绍及应用
  • 原文地址:https://blog.csdn.net/u014635374/article/details/133960243