dg-publish: “true” tags:
- 数据库-DataBase 数据迁移-迁移-同步 SQL-数据查询语言 文件-文档-txt文件-笔记 (电脑-PC-桌面端-计算机)应用-软件-程序-app 网站-网页端-web端-web应用-webAPP 导入的同义词
- father::SQL数据库
- base::TypeORM_迁移
数据库迁移脚本
概念
数据库迁移脚本本质上是一组 SQL 语句的集合,用于将数据库从一个状态转变为另一个状态。其核心公式为:
状态A + 迁移脚本 → 状态B
迁移脚本记录了数据库模式(schema)的变更,包括表结构、索引、约束条件以及初始数据等方面的修改。
主要作用
版本控制
- 追踪数据库结构的变化历史
- 将数据库变更与代码变更保持同步
- 支持回滚到之前的数据库状态
环境同步
- 确保开发、测试和生产环境的数据库结构一致
- 简化新环境的搭建过程
- 减少人工操作带来的错误
初始化数据
- 为新安装的系统提供基础数据
- 在空数据库上快速应用所有历史变更
- 减少重复的手动数据操作
工作流程
基本流程
- 数据库初始状态为空
- 开发者通过代码插入一些初始数据
- 生成描述这些变更的迁移脚本
- 其他开发者或部署环境拉取项目时
- 运行数据库初始化,应用迁移脚本
- 数据库直接初始化到最新状态,无需执行初始化代码
增量变更
- 开发者对现有数据库进行修改
- 生成描述这些新变更的迁移脚本
- 将迁移脚本提交到版本控制系统
- 其他环境应用新的迁移脚本,同步数据库状态
实现方式
手动迁移
- 开发者手动编写 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 插件在移动应用中应用迁移
- 实现跨设备的数据库状态一致性