SQL文件的使用

3 min

:deer: 前言

在开源项目中,SQL 文件通常用于以下几个目的:

  1. 数据库初始化: 在部署新环境时,可以使用 SQL 文件初始化数据库,创建表结构、索引等。
  2. 数据迁移: 进行数据库结构的变更(如新增字段、修改字段类型等),可以通过 SQL 文件记录和执行这些变更。
  3. 备份和恢复: 将数据库结构和数据备份到 SQL 文件中,可以在需要时恢复。

如何生成 SQL 文件

虽然 Gorm 没有直接生成 SQL 文件的命令,但可以通过以下几种方式生成 SQL 文件:

方法 1: 使用 gormigrate 生成迁移 SQL 文件

gormigrate 是一个用于管理数据库版本迁移的库,可以与 Gorm 一起使用。虽然 gormigrate 主要用于代码内的迁移,但也可以用来生成 SQL 文件。

  1. 安装 gormigrate

    go get -u github.com/go-gormigrate/gormigrate/v2
  2. 定义迁移

    在代码中定义迁移,然后将迁移记录到文件中:

    package main
    
    import (
        "log"
        "time"
        "github.com/go-gormigrate/gormigrate/v2"
        "gorm.io/driver/mysql"
        "gorm.io/gorm"
    )
    
    type Contact struct {
        ID         uint64    `gorm:"primaryKey;autoIncrement;comment:'id'"`
        UID        uint64    `gorm:"not null;comment:'uid'"`
        RoomID     uint64    `gorm:"not null;comment:'房间id'"`
        ReadTime   time.Time `gorm:"type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);comment:'阅读到的时间'"`
        ActiveTime *time.Time `gorm:"type:datetime(3);comment:'会话内消息最后更新的时间(只有普通会话需要维护,全员会话不需要维护)'"`
        LastMsgID  *uint64   `gorm:"comment:'会话最新消息id'"`
        CreateTime time.Time `gorm:"type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);comment:'创建时间'"`
        UpdateTime time.Time `gorm:"type:datetime(3);not null;default:CURRENT_TIMESTAMP(3) on update CURRENT_TIMESTAMP(3);comment:'修改时间'"`
    }
    
    func main() {
        dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
            log.Fatalf("failed to connect database: %v", err)
        }
    
        m := gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{
            {
                ID: "20230724_create_contact_table",
                Migrate: func(tx *gorm.DB) error {
                    return tx.AutoMigrate(&Contact{})
                },
                Rollback: func(tx *gorm.DB) error {
                    return tx.Migrator().DropTable("contacts")
                },
            },
        })
    
        if err = m.Migrate(); err != nil {
            log.Fatalf("could not migrate: %v", err)
        }
    
        log.Printf("migration did run successfully")
    }
  3. 运行迁移

    运行上述代码,会在数据库中执行迁移。如果需要将这些迁移保存为 SQL 文件,可以在数据库中创建表结构后使用数据库管理工具导出。

方法 2: 直接从数据库导出 SQL 文件

  • 在数据库中创建表结构后,可以使用数据库管理工具(如 MySQL WorkbenchphpMyAdmin、j 等)或命令行工具(如 mysqldump)从数据库导出 SQL 文件。

    mysqldump -u yourusername -p yourdatabase > schema.sql
  • 如果只要表结构不要数据

    mysqldump -u username -p --no-data database_name > schema.sql

如何运行 SQL 文件

或者用navicat直接运行sql文件。

运行 SQL 文件可以使用数据库客户端工具或者命令行工具。例如,使用 MySQL 的命令行工具:

  1. 登录到 MySQL

    mysql -u yourusername -p
  2. 选择数据库

    USE yourdatabase;
  3. 运行 SQL 文件

    SOURCE /path/to/your/schema.sql;
  • 通过以上步骤,可以将 SQL 文件中的所有命令在数据库中执行。