gorm连接mysql数据库以及建表和自动迁移

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDSClaw,2核4GB
简介: gorm连接mysql数据库以及建表和自动迁移

前言

本书皆是对官方文档常用的内容进行描述

包括:连接数据库,建表,自动迁移,Migrator接口

连接

连接数据库

连接到数据库

最简单的连接方式

import (
  "fmt"
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)
func main() {
  //dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  //db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  //想要正确的处理 time.Time ,您需要带上 parseTime 参数, (更多参数) 要支持完整的 UTF-8 编码,您需要将 charset=utf8 更改为 charset=utf8mb4 查看 此文章 获取详情
  dsn := "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  fmt.Println(db, err)
}

配置mysql

但是我们在使用的过程中,还会对数据库连接进行一些设置,MySQl 驱动程序提供了 一些高级配置 可以在初始化过程中使用。更多配置见官方文档

func main() {
  dsn := "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.New(mysql.Config{
    DSN:                       dsn,
    DefaultStringSize:         256,   // string 类型字段的默认长度
    DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
    DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
    DontSupportRenameColumn:   true,  // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
    SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
  }), &gorm.Config{})
  fmt.Println(db, err)
}

配置gorm

不仅仅是mysql连接可以配置,我们对gorm也可以进行配置。更多配置见官方文档

GORM 配置

func main() {
  dsn := "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.New(mysql.Config{
    DSN: dsn,
  }), &gorm.Config{
    SkipDefaultTransaction: false, //跳过默认事务
    NamingStrategy: schema.NamingStrategy{
      SingularTable: true, // 复数形式 User的表名应该是users
      TablePrefix:   "t_", //表名前缀 User的表名应该是t_users
    },
    DisableForeignKeyConstraintWhenMigrating: true, //设置成为逻辑外键(在物理数据库上没有外键,仅体现在代码上)
  })
  fmt.Println(db, err)
}

常规数据库接口-连接池

GORM 提供了 DB 方法,可用于从当前 *gorm.DB 返回一个通用的数据库接口 *sql.DB

func main() {
  dsn := "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.New(mysql.Config{
    DSN: dsn,
  }), &gorm.Config{
    SkipDefaultTransaction: false, //跳过默认事务
    NamingStrategy: schema.NamingStrategy{
      SingularTable: false,  // 复数形式 User的表名应该是users
      TablePrefix:   "gva_", //表名前缀 User的表名应该是t_users
    },
    DisableForeignKeyConstraintWhenMigrating: true, //设置成为逻辑外键(在物理数据库上没有外键,仅体现在代码上)
  })
  // 获取通用数据库对象 sql.DB ,然后使用其提供的功能
  sqlDB, err := db.DB()
  // SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
  sqlDB.SetMaxIdleConns(10)
  // SetMaxOpenConns 设置打开数据库连接的最大数量。
  sqlDB.SetMaxOpenConns(100)
  // SetConnMaxLifetime 设置了连接可复用的最大时间。
  sqlDB.SetConnMaxLifetime(time.Hour)
}

迁移

迁移

自动迁移建表

func main() {
  dsn := "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.New(mysql.Config{
    DSN: dsn,
  }), &gorm.Config{
    SkipDefaultTransaction: false, //跳过默认事务
    NamingStrategy: schema.NamingStrategy{
      SingularTable: true, // 复数形式 User的表名应该是users
      TablePrefix:   "gva_", //表名前缀 User的表名应该是t_users
    },
    DisableForeignKeyConstraintWhenMigrating: true, //设置成为逻辑外键(在物理数据库上没有外键,仅体现在代码上)
  })
  fmt.Println(db, err)
  type User struct {
    Name string
  }
  err = db.AutoMigrate(&User{})
  if err != nil {
    fmt.Println(err)
  }
}

手动迁移建表

我们查看db.AutoMigrate,发现其内部是调用了一个接口type Migrator interface,里面有很多方法,Migrator 接口是一个统一的ap接口

func (db *DB) AutoMigrate(dst ...interface{}) error {
  return db.Migrator().AutoMigrate(dst...)
}
// Migrator migrator interface
type Migrator interface {
  //下一小节
}

所以我们可以自动去建表

m:=db.Migrator()
m.CreateTable(&User{})

Migrator接口

我们发现该接口有很多方法

// Migrator migrator interface
type Migrator interface {
  // AutoMigrate
  AutoMigrate(dst ...interface{}) error
  // Database
  CurrentDatabase() string
  FullDataTypeOf(*schema.Field) clause.Expr
  // Tables
  CreateTable(dst ...interface{}) error
  DropTable(dst ...interface{}) error
  HasTable(dst interface{}) bool
  RenameTable(oldName, newName interface{}) error
  GetTables() (tableList []string, err error)
  // Columns
  AddColumn(dst interface{}, field string) error
  DropColumn(dst interface{}, field string) error
  AlterColumn(dst interface{}, field string) error
  MigrateColumn(dst interface{}, field *schema.Field, columnType ColumnType) error
  HasColumn(dst interface{}, field string) bool
  RenameColumn(dst interface{}, oldName, field string) error
  ColumnTypes(dst interface{}) ([]ColumnType, error)
  // Views
  CreateView(name string, option ViewOption) error
  DropView(name string) error
  // Constraints
  CreateConstraint(dst interface{}, name string) error
  DropConstraint(dst interface{}, name string) error
  HasConstraint(dst interface{}, name string) bool
  // Indexes
  CreateIndex(dst interface{}, name string) error
  DropIndex(dst interface{}, name string) error
  HasIndex(dst interface{}, name string) bool
  RenameIndex(dst interface{}, oldName, newName string) error
}

常用的Migrator方法

创建表

m:=db.Migrator()
m.CreateTable(&User{})

是否存在表

//以结构体的方式查
m.HasTable(&User{})
//以表名的方式查
fmt.Println(m.HasTable("gva_users"))

删除表

  err = m.DropTable(&User{})
  if err != nil {
    fmt.Println(err)
  }
  err = m.DropTable("gva_users")
  if err != nil {
    fmt.Println(err)
  }
  if m.HasTable(&User{}) {
    m.DropTable(&User{})
  } else {
    m.CreateTable(&User{})
  }

重命名表

将gva_users表改为gva_users_two表

m := db.Migrator()
  m.RenameTable(&User{}, "gva_users_two")

这个时候再通过原来的结构体查询就查不到了

fmt.Println( m.HasTable(&User{}))//false

所以一般建议这样写

  type User struct {
    Name string
  }
  m := db.Migrator()
  type UserTwo struct {
    Name string
  }
  m.RenameTable(&User{},&UserTwo{})

更多的api

可以看到,这些api都是在type Migrator interface 这个结构体中,所以直接看该接口有哪些方法即可,更多的api使用直接翻阅官方文档迁移即可


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
7月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
344 13
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
1679 11
|
7月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
746 11
|
7月前
|
SQL 关系型数据库 MySQL
排除通过IP访问MySQL时出现的连接错误问题
以上步骤涵盖了大多数遇到远程连接 MySQL 数据库时出现故障情形下所需采取措施,在执行每个步骤后都应该重新尝试建立链接以验证是否已经解决问题,在多数情形下按照以上顺序执行将能够有效地排除并修复大多数基本链接相关故障。
495 3
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
502 158
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1266 152
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
941 156
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
529 156
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
634 161

推荐镜像

更多
下一篇
开通oss服务