dg-publish: “true” tags:

  • 数据库-DataBase 数据迁移-迁移-同步 SQL-数据查询语言 文件-文档-txt文件-笔记 (电脑-PC-桌面端-计算机)应用-软件-程序-app 网站-网页端-web端-web应用-webAPP 导入的同义词

数据库迁移脚本

概念

数据库迁移脚本本质上是一组 SQL 语句的集合,用于将数据库从一个状态转变为另一个状态。其核心公式为:

状态A + 迁移脚本 → 状态B

迁移脚本记录了数据库模式(schema)的变更,包括表结构、索引、约束条件以及初始数据等方面的修改。

主要作用

版本控制

  • 追踪数据库结构的变化历史
  • 将数据库变更与代码变更保持同步
  • 支持回滚到之前的数据库状态

环境同步

  • 确保开发、测试和生产环境的数据库结构一致
  • 简化新环境的搭建过程
  • 减少人工操作带来的错误

初始化数据

  • 为新安装的系统提供基础数据
  • 在空数据库上快速应用所有历史变更
  • 减少重复的手动数据操作

工作流程

基本流程

  1. 数据库初始状态为空
  2. 开发者通过代码插入一些初始数据
  3. 生成描述这些变更的迁移脚本
  4. 其他开发者或部署环境拉取项目时
  5. 运行数据库初始化,应用迁移脚本
  6. 数据库直接初始化到最新状态,无需执行初始化代码

增量变更

  1. 开发者对现有数据库进行修改
  2. 生成描述这些新变更的迁移脚本
  3. 将迁移脚本提交到版本控制系统
  4. 其他环境应用新的迁移脚本,同步数据库状态

实现方式

手动迁移

  • 开发者手动编写 SQL 变更脚本
  • 按照版本号或时间戳组织脚本文件
  • 使用脚本运行工具按顺序执行

ORM 框架支持

  • 许多 ORM 框架提供迁移支持,如 TypeORM、Sequelize、Django ORM 等
  • 可以比较代码中的模型定义与数据库当前状态
  • 自动生成迁移脚本,减少手动编写的工作量

专用工具

  • Flyway、Liquibase 等专门的数据库迁移工具
  • 提供更强大的迁移管理功能
  • 支持复杂的迁移场景和回滚策略

实际示例

以下是一个简单的 SQL 迁移脚本示例,用于创建用户表并添加初始管理员用户:

-- 创建用户表
CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT NOT NULL UNIQUE,
  password TEXT NOT NULL,
  email TEXT UNIQUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
 
-- 添加初始管理员用户
INSERT INTO users (username, password, email)
VALUES ('admin', 'hashed_password_here', 'admin@example.com');

最佳实践

版本控制

  • 为每个迁移脚本分配唯一标识符(如时间戳)
  • 迁移脚本一旦应用于生产环境,不应再修改
  • 通过新的迁移脚本来修正先前的错误

幂等性

  • 设计迁移脚本使其可以多次执行而不产生错误
  • 使用”IF NOT EXISTS”等条件语句
  • 避免在应用于生产环境后修改已有迁移脚本

测试

  • 在应用到生产环境前,在测试环境验证迁移脚本
  • 包括向上迁移(升级)和向下迁移(回滚)测试
  • 验证应用程序与迁移后的数据库兼容性

使用案例

一个典型的使用案例如 Ionic 7 与 TypeORM 结合开发 SQLite 数据库应用:

  • 使用 TypeORM 定义实体模型
  • 生成迁移脚本捕获模型变更
  • 通过 @capacitor-community/sqlite 插件在移动应用中应用迁移
  • 实现跨设备的数据库状态一致性