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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 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使用直接翻阅官方文档迁移即可


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
44 25
|
5天前
|
存储 NoSQL MongoDB
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
11天前
|
关系型数据库 MySQL 数据库连接
Unity连接Mysql数据库 增 删 改 查
在 Unity 中连接 MySQL 数据库,需使用 MySQL Connector/NET 作为数据库连接驱动,通过提供服务器地址、端口、用户名和密码等信息建立 TCP/IP 连接。代码示例展示了如何创建连接对象并执行增删改查操作,确保数据交互的实现。测试代码中,通过 `MySqlConnection` 类连接数据库,并使用 `MySqlCommand` 执行 SQL 语句,实现数据的查询、插入、删除和更新功能。
|
25天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
30天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
55 2
|
12天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
91 42
|
30天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
256 0
|
2月前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
73 3
|
2月前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
117 2
|
2月前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
125 3