Node DDD Boilerplate迁移策略:Sequelize数据库迁移与种子数据终极指南
【免费下载链接】node-ddd-boilerplateNode DDD Boilerplate项目地址: https://gitcode.com/gh_mirrors/no/node-ddd-boilerplate
Node DDD Boilerplate是一个基于领域驱动设计(DDD)的Node.js REST API框架,它提供了完整的数据库迁移和种子数据解决方案。对于新手和普通用户来说,掌握Sequelize数据库迁移策略是项目成功的关键。本文将详细介绍如何在这个强大的DDD框架中高效管理数据库变更。
📊 为什么数据库迁移如此重要?
在Node DDD Boilerplate项目中,数据库迁移是保证数据一致性和版本控制的核心机制。想象一下,你的团队有多个开发人员,每个人都在本地开发环境中修改数据库结构。如果没有统一的迁移策略,数据库结构就会变得混乱不堪,部署到生产环境时会出现各种问题。
Sequelize作为Node.js最流行的ORM工具,在Node DDD Boilerplate中扮演着关键角色。它提供了一套完整的数据库迁移解决方案,让你能够:
- 版本控制数据库结构:像管理代码一样管理数据库变更
- 团队协作:确保所有开发人员使用相同的数据库结构
- 环境一致性:开发、测试、生产环境数据库结构保持一致
- 回滚能力:轻松撤销错误的数据库变更
🚀 快速开始:安装与配置
安装必备工具
首先,确保你已经安装了Sequelize CLI工具:
npm install -g sequelize-cli如果你更喜欢使用项目本地安装:
npm install --save-dev sequelize-cli配置数据库连接
Node DDD Boilerplate的数据库配置位于config/database.js,支持多种环境配置:
module.exports = { development: { 'url': process.env.DATABASE_URL, 'dialect': 'postgres' }, test: { 'url': process.env.DATABASE_URL_TEST, 'dialect': 'postgres', logging: false // 测试环境关闭日志 }, production: { 'url': process.env.DATABASE_URL_PRODUCTION, 'dialect': 'postgres', 'ssl': true, 'dialectOptions': { 'ssl': { 'require': true } } } }📁 项目结构解析
Node DDD Boilerplate的数据库相关文件组织得非常清晰:
src/infra/sequelize/ ├── migrations/ # 数据库迁移文件 │ ├── 001-users.js # 用户表迁移 │ └── 002-company.js # 公司表迁移 ├── seeders/ # 种子数据 │ ├── development/ # 开发环境数据 │ │ ├── 001-users.js │ │ └── 002-company.js │ └── production/ # 生产环境数据 └── index.js # Sequelize配置🔧 创建数据库迁移文件
基本迁移文件结构
每个迁移文件都包含up和down两个函数:
// src/infra/sequelize/migrations/001-users.js 'use strict' module.exports = { up: function (queryInterface, Sequelize) { return queryInterface.createTable('users', { id: { type: Sequelize.UUID, defaultValue: Sequelize.UUIDV4, primaryKey: true, allowNull: false }, firstName: { type: Sequelize.STRING, allowNull: false }, // ... 更多字段定义 createdAt: { allowNull: false, type: Sequelize.DATE, defaultValue: Sequelize.fn('NOW') }, updatedAt: { allowNull: false, type: Sequelize.DATE, defaultValue: Sequelize.fn('NOW') } }) }, down: function (queryInterface) { return queryInterface.dropTable('users') } }创建新的迁移文件
使用Sequelize CLI创建新的迁移文件:
npx sequelize migration:create --name add-email-verification这将在src/infra/sequelize/migrations/目录下创建一个新的迁移文件,文件名以时间戳开头,确保执行顺序正确。
🌱 种子数据管理策略
开发环境种子数据
Node DDD Boilerplate为不同环境提供了独立的种子数据配置。开发环境的种子数据位于src/infra/sequelize/seeders/development/001-users.js:
const { encryptPassword } = require('src/infra/encryption') module.exports = () => { const password = encryptPassword('pass') return [{ id: '48e40a9c-c5e9-4d63-9aba-b77cdf4ca67b', firstName: 'Test', lastName: 'Developer', middleName: 'Super Dev', email: 'testdev@gmail.com', password: password, roleId: 1, verificationCode: 'ba1bfda5-1c27-4755-bd23-36c7a4dbfd2b', isVerified: 1, isDeleted: 0, createdBy: '48e40a9c-c5e9-4d63-9aba-b77cdf4ca67b' }] }使用Faker生成测试数据
项目使用了智能的Faker系统,位于src/infra/support/fakers/。这个系统根据当前环境自动加载对应的数据文件:
// src/infra/support/fakers/index.js require('dotenv').load() const path = require('path') module.exports = function createFixtureRoutes (fixtureURI) { const basePath = process.env.NODE_ENV || 'development' const fixturePath = path.resolve(`src/infra/support/fakers/${basePath}`, fixtureURI) const Fixture = require(fixturePath) return Fixture() }⚡ 常用迁移命令速查表
基础迁移操作
| 命令 | 功能描述 | 使用场景 |
|---|---|---|
yarn db:refresh | 重置并运行所有迁移 | 开发环境数据库重置 |
yarn db:reset | 运行所有迁移和种子数据 | 全新环境初始化 |
yarn migrate | 应用数据库变更 | 部署新版本 |
sequelize db:migrate:undo | 回滚最后一次迁移 | 撤销错误变更 |
sequelize db:migrate:undo:all | 回滚所有迁移 | 完全重置数据库 |
环境特定的命令
# 开发环境 yarn db:refresh # 重置开发数据库 yarn seed # 运行开发环境种子数据 # 测试环境 yarn db:refresh-test # 重置测试数据库 yarn seed:test # 运行测试环境种子数据🐳 Docker环境下的数据库迁移
Node DDD Boilerplate提供了完整的Docker支持,包括数据库迁移命令:
# 使用Docker重置数据库 yarn docker:db:reset # 使用Docker刷新数据库 yarn docker:db:refresh # 使用Docker运行测试 yarn docker:test这些命令在docker-compose环境中执行,确保开发、测试和生产环境的一致性。
🔄 迁移工作流程最佳实践
1. 开发环境工作流
# 1. 创建新的迁移文件 npx sequelize migration:create --name add-new-feature # 2. 编辑迁移文件 # 在 src/infra/sequelize/migrations/ 中编辑新创建的迁移文件 # 3. 运行迁移 yarn migrate # 4. 创建种子数据(如果需要) npx sequelize seed:create --name seed-new-data # 5. 运行种子数据 yarn seed2. 团队协作策略
- 版本控制迁移文件:所有迁移文件必须提交到版本控制系统
- 命名规范:使用描述性的迁移文件名,如
add-user-roles-table.js - 顺序执行:Sequelize按文件名顺序执行迁移,使用时间戳确保正确顺序
- 避免直接修改数据库:所有数据库变更必须通过迁移文件进行
3. 生产环境部署流程
# 1. 备份当前数据库 pg_dump your_database > backup_$(date +%Y%m%d).sql # 2. 运行迁移 NODE_ENV=production yarn migrate # 3. 验证迁移结果 # 检查数据库结构和数据完整性 # 4. 回滚计划(如有问题) NODE_ENV=production sequelize db:migrate:undo🛠️ 高级迁移技巧
1. 数据迁移与结构迁移分离
在Node DDD Boilerplate中,建议将数据迁移(种子数据)和结构迁移分开处理:
- 结构迁移:表结构、索引、约束变更
- 数据迁移:初始数据、参考数据、测试数据
2. 使用事务确保数据一致性
module.exports = { up: function (queryInterface, Sequelize) { return queryInterface.sequelize.transaction(function (t) { return Promise.all([ queryInterface.createTable('new_table', { // 表结构定义 }, { transaction: t }), queryInterface.addColumn('existing_table', 'new_column', { type: Sequelize.STRING, allowNull: true }, { transaction: t }) ]) }) }, down: function (queryInterface) { // 回滚逻辑 } }3. 处理外键约束
up: function (queryInterface, Sequelize) { return queryInterface.createTable('orders', { id: { type: Sequelize.UUID, primaryKey: true }, userId: { type: Sequelize.UUID, references: { model: 'users', // 引用users表 key: 'id' }, onUpdate: 'CASCADE', onDelete: 'SET NULL' } }) }📊 监控与维护
1. 迁移状态检查
# 查看已应用的迁移 npx sequelize db:migrate:status # 查看迁移历史 npx sequelize db:migrate:history2. 性能优化建议
- 批量操作:使用
bulkInsert而不是单条插入 - 索引优化:为常用查询字段添加索引
- 迁移文件大小:保持迁移文件小而专注,每个文件只做一件事
🚨 常见问题与解决方案
问题1:迁移失败如何处理?
症状:迁移过程中出现错误,数据库处于不一致状态。
解决方案:
# 1. 查看错误日志 tail -f logs/sequelize.log # 2. 回滚到上一个稳定状态 sequelize db:migrate:undo # 3. 修复迁移文件后重新运行 yarn migrate问题2:种子数据冲突
症状:种子数据插入时出现唯一约束冲突。
解决方案:
// 在种子文件中使用upsert或忽略重复 module.exports = { up: function (queryInterface, Sequelize) { return queryInterface.bulkInsert('users', usersData, { ignoreDuplicates: true // 忽略重复记录 }) } }问题3:跨环境迁移不一致
症状:开发环境正常,但生产环境迁移失败。
解决方案:
- 确保所有环境使用相同版本的数据库
- 在生产环境测试迁移脚本
- 使用Docker确保环境一致性
🎯 总结
Node DDD Boilerplate的Sequelize数据库迁移策略为项目提供了强大的数据库版本控制能力。通过合理的迁移文件组织、环境隔离的种子数据管理以及完善的命令行工具,你可以:
✅确保数据库结构一致性
✅简化团队协作流程
✅降低部署风险
✅提高开发效率
记住,良好的数据库迁移策略是项目成功的基础。从第一天开始就采用Node DDD Boilerplate的最佳实践,你的项目将拥有坚实的数据库基础。
开始你的Node DDD Boilerplate迁移之旅吧!🚀 通过合理的数据库管理,你的应用将更加稳定、可维护和可扩展。
【免费下载链接】node-ddd-boilerplateNode DDD Boilerplate项目地址: https://gitcode.com/gh_mirrors/no/node-ddd-boilerplate
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考