Sequelize 数据库迁移全面指南
【免费下载链接】sequelize-docs-Zh-CN 项目地址: https://gitcode.com/gh_mirrors/se/sequelize-docs-Zh-CN
什么是数据库迁移
数据库迁移是一种管理数据库结构变更的机制,类似于我们使用版本控制系统(如Git)管理代码变更。通过迁移文件,我们可以记录数据库结构的每一次变更,包括如何应用变更(升级)和如何撤销变更(回滚)。
为什么需要迁移
- 版本控制:跟踪数据库结构的历史变更
- 团队协作:确保团队成员使用相同的数据库结构
- 环境一致性:在不同环境(开发、测试、生产)中保持数据库结构一致
- 回滚能力:当变更出错时可以快速恢复到之前的状态
安装与初始化
安装 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:迁移文件
迁移文件结构
典型的迁移文件包含 up 和 down 两个方法:
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'
}
};
最佳实践
- 小步提交:每次迁移只做一个小变更
- 测试迁移:在测试环境验证迁移脚本
- 备份数据:执行重要迁移前备份数据
- 文档记录:为复杂迁移添加注释说明
- 团队协作:确保团队成员同步最新迁移
通过遵循这些指南,你可以有效地使用 Sequelize 迁移来管理数据库结构的变更,确保项目的数据库始终保持一致和可维护。
【免费下载链接】sequelize-docs-Zh-CN 项目地址: https://gitcode.com/gh_mirrors/se/sequelize-docs-Zh-CN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



