Sequelize 数据库迁移全面指南

Sequelize 数据库迁移全面指南

【免费下载链接】sequelize-docs-Zh-CN 【免费下载链接】sequelize-docs-Zh-CN 项目地址: https://gitcode.com/gh_mirrors/se/sequelize-docs-Zh-CN

什么是数据库迁移

数据库迁移是一种管理数据库结构变更的机制,类似于我们使用版本控制系统(如Git)管理代码变更。通过迁移文件,我们可以记录数据库结构的每一次变更,包括如何应用变更(升级)和如何撤销变更(回滚)。

为什么需要迁移

  1. 版本控制:跟踪数据库结构的历史变更
  2. 团队协作:确保团队成员使用相同的数据库结构
  3. 环境一致性:在不同环境(开发、测试、生产)中保持数据库结构一致
  4. 回滚能力:当变更出错时可以快速恢复到之前的状态

安装与初始化

安装 Sequelize CLI

npm install --save-dev sequelize-cli

初始化项目结构

npx sequelize-cli init

这会创建以下目录结构:

config/      # 数据库连接配置
models/      # 数据模型定义
migrations/  # 迁移文件
seeders/     # 种子数据文件

配置数据库连接

编辑 config/config.json 文件,配置不同环境的数据库连接:

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_dev",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_prod",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

创建模型与迁移

生成模型和迁移文件

npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

这会同时创建:

  • models/user.js:模型定义文件
  • migrations/XXXXXXXXXXXXXX-create-user.js:迁移文件

迁移文件结构

典型的迁移文件包含 updown 两个方法:

module.exports = {
  up: (queryInterface, Sequelize) => {
    // 执行迁移的逻辑
    return queryInterface.createTable('Users', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      firstName: Sequelize.STRING,
      lastName: Sequelize.STRING,
      email: Sequelize.STRING,
      createdAt: Sequelize.DATE,
      updatedAt: Sequelize.DATE
    });
  },
  down: (queryInterface, Sequelize) => {
    // 撤销迁移的逻辑
    return queryInterface.dropTable('Users');
  }
};

执行迁移

运行所有待处理的迁移

npx sequelize-cli db:migrate

回滚最近一次迁移

npx sequelize-cli db:migrate:undo

回滚所有迁移

npx sequelize-cli db:migrate:undo:all

高级迁移技巧

使用事务确保数据一致性

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.sequelize.transaction(t => {
      return Promise.all([
        queryInterface.addColumn('Users', 'age', {
          type: Sequelize.INTEGER
        }, { transaction: t }),
        queryInterface.addColumn('Users', 'gender', {
          type: Sequelize.STRING
        }, { transaction: t })
      ]);
    });
  },
  down: (queryInterface) => {
    return queryInterface.sequelize.transaction(t => {
      return Promise.all([
        queryInterface.removeColumn('Users', 'age', { transaction: t }),
        queryInterface.removeColumn('Users', 'gender', { transaction: t })
      ]);
    });
  }
};

创建外键约束

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.addColumn('Posts', 'userId', {
      type: Sequelize.INTEGER,
      references: {
        model: 'Users',
        key: 'id'
      },
      onUpdate: 'CASCADE',
      onDelete: 'SET NULL'
    });
  },
  down: (queryInterface) => {
    return queryInterface.removeColumn('Posts', 'userId');
  }
};

种子数据管理

创建种子文件

npx sequelize-cli seed:generate --name demo-user

编写种子数据

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.bulkInsert('Users', [{
      firstName: 'John',
      lastName: 'Doe',
      email: 'john@example.com',
      createdAt: new Date(),
      updatedAt: new Date()
    }]);
  },
  down: (queryInterface) => {
    return queryInterface.bulkDelete('Users', null, {});
  }
};

执行种子数据

npx sequelize-cli db:seed:all

回滚种子数据

npx sequelize-cli db:seed:undo:all

自定义配置

使用 .sequelizerc 文件

const path = require('path');

module.exports = {
  'config': path.resolve('config', 'database.json'),
  'models-path': path.resolve('db', 'models'),
  'seeders-path': path.resolve('db', 'seeders'),
  'migrations-path': path.resolve('db', 'migrations')
};

动态配置

// config/config.js
module.exports = {
  development: {
    username: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME,
    host: process.env.DB_HOST,
    dialect: 'mysql'
  }
};

最佳实践

  1. 小步提交:每次迁移只做一个小变更
  2. 测试迁移:在测试环境验证迁移脚本
  3. 备份数据:执行重要迁移前备份数据
  4. 文档记录:为复杂迁移添加注释说明
  5. 团队协作:确保团队成员同步最新迁移

通过遵循这些指南,你可以有效地使用 Sequelize 迁移来管理数据库结构的变更,确保项目的数据库始终保持一致和可维护。

【免费下载链接】sequelize-docs-Zh-CN 【免费下载链接】sequelize-docs-Zh-CN 项目地址: https://gitcode.com/gh_mirrors/se/sequelize-docs-Zh-CN

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值