
关于
精通跨 ORM(Sequelize、TypeORM、Prisma)的数据库 Schema 和数据迁移,包括回滚策略和零停机部署。
name: database-migration description: "掌握跨 ORM(Sequelize、TypeORM、Prisma)的数据库模式和数据迁移,包括回滚策略和零停机部署。" risk: unknown source: community date_added: "2026-02-27"
数据库迁移
掌握跨 ORM(Sequelize、TypeORM、Prisma)的数据库模式和数据迁移,包括回滚策略和零停机部署。
不要在以下情况使用此技能
- 任务与数据库迁移无关
- 需要此范围之外的其他领域或工具
指导原则
- 明确目标、约束和所需输入。
- 应用相关最佳实践并验证结果。
- 提供可操作的步骤和验证方法。
- 如需详细示例,请打开
resources/implementation-playbook.md。
在以下情况使用此技能
- 在不同 ORM 之间迁移
- 执行模式转换
- 在数据库之间移动数据
- 实施回滚程序
- 零停机部署
- 数据库版本升级
- 数据模型重构
ORM 迁移
Sequelize 迁移
// migrations/20231201-create-users.js
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('users', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
email: {
type: Sequelize.STRING,
unique: true,
allowNull: false
},
createdAt: Sequelize.DATE,
updatedAt: Sequelize.DATE
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('users');
}
};
// Run: npx sequelize-cli db:migrate
// Rollback: npx sequelize-cli db:migrate:undo
TypeORM 迁移
// migrations/1701234567-CreateUsers.ts
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
export class CreateUsers1701234567 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'users',
columns: [
{
name: 'id',
type: 'int',
isPrimary: true,
isGenerated: true,
generationStrategy: 'increment'
},
{
name: 'email',
type: 'varchar',
isUnique: true
},
{
name: 'created_at',
type: 'timestamp',
default: 'CURRENT_TIMESTAMP'
}
]
})
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('users');
}
}
// Run: npm run typeorm migration:run
// Rollback: npm run typeorm migration:revert
Prisma 迁移
// schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
createdAt DateTime @default(now())
}
// Generate migration: npx prisma migrate dev --name create_users
// Apply: npx prisma migrate deploy
模式转换
添加带默认值的列
// 安全迁移:添加带默认值的列
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.addColumn('users', 'status', {
type: Sequelize.STRING,
defaultValue: 'active',
allowNull: false
});
},
down: async (queryInterface) => {
await queryInterface.removeColumn('users', 'status');
}
};
重命名列(零停机)
// 步骤 1:添加新列
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.addColumn('users', 'full_name', {
type: Sequelize.STRING
});
// 从旧列复制数据
await queryInterface.sequelize.query(
'UPDATE users SET full_name = name'
);
},
down: async (queryInterface) => {
await queryInterface.removeColumn('users', 'full_name');
}
};
// 步骤 2:更新应用程序使用新列
// 步骤 3:删除旧列
module.exports = {
up: async (queryInterface) => {
await queryInterface.removeColumn('users', 'name');
},
down: async (queryInterface, Sequelize) => {
await queryInterface.addColumn('users', 'name', {
type: Sequelize.STRING
});
}
};
更改列类型
module.exports = {
up: async (queryInterface, Sequelize) => {
// 对于大表,使用多步骤方法
// 1. 添加新列
await queryInterface.addColumn('users', 'age_new', {
type: Sequelize.INTEGER
});
// 2. 复制并转换数据
await queryInterface.sequelize.query(`
UPDATE users
SET age_new = CAST(age AS INTEGER)
WHERE age IS NOT NULL
`);
// 3. 删除旧列
await queryInterface.removeColumn('users', 'age');
// 4. 重命名新列
await queryInterface.renameColumn('users', 'age_new', 'age');
},
down: async (queryInterface, Sequelize) => {
await queryInterface.
}
};
兼容工具
Claude CodeCursor
标签
数据工程
