Files

120 lines
3.4 KiB
JavaScript
Raw Permalink Normal View History

const { sequelize } = require('../db');
async function migrate() {
try {
console.log('开始迁移:添加 pending 状态到用户表...');
const queryInterface = sequelize.getQueryInterface();
const dialect = sequelize.getDialect();
if (dialect === 'sqlite') {
// SQLite 不支持 ALTER COLUMN,需要重建表
console.log('检测到 SQLite 数据库,使用重建表方式迁移...');
// 1. 创建新表
await queryInterface.createTable('users_new', {
userId: {
type: sequelize.Sequelize.STRING,
primaryKey: true,
allowNull: false,
},
username: {
type: sequelize.Sequelize.STRING,
allowNull: false,
unique: true,
},
password: {
type: sequelize.Sequelize.STRING,
allowNull: false,
},
email: {
type: sequelize.Sequelize.STRING,
allowNull: true,
},
phone: {
type: sequelize.Sequelize.STRING,
allowNull: true,
},
realName: {
type: sequelize.Sequelize.STRING,
allowNull: true,
},
avatar: {
type: sequelize.Sequelize.STRING,
allowNull: true,
},
status: {
type: sequelize.Sequelize.ENUM('active', 'inactive', 'locked', 'pending'),
defaultValue: 'active',
},
lastLoginTime: {
type: sequelize.Sequelize.DATE,
allowNull: true,
},
lastLoginIp: {
type: sequelize.Sequelize.STRING,
allowNull: true,
},
loginCount: {
type: sequelize.Sequelize.INTEGER,
defaultValue: 0,
},
remark: {
type: sequelize.Sequelize.TEXT,
allowNull: true,
},
createdAt: {
type: sequelize.Sequelize.DATE,
allowNull: false,
},
updatedAt: {
type: sequelize.Sequelize.DATE,
allowNull: false,
},
});
// 2. 复制数据
await sequelize.query(`
INSERT INTO users_new (
userId, username, password, email, phone, realName, avatar,
status, lastLoginTime, lastLoginIp, loginCount, remark, createdAt, updatedAt
)
SELECT
userId, username, password, email, phone, realName, avatar,
status, lastLoginTime, lastLoginIp, loginCount, remark, createdAt, updatedAt
FROM users
`);
// 3. 删除旧表
await queryInterface.dropTable('users');
// 4. 重命名新表
await queryInterface.renameTable('users_new', 'users');
// 5. 重新创建索引
await queryInterface.addIndex('users', ['status']);
await queryInterface.addIndex('users', ['username']);
await queryInterface.addIndex('users', ['email']);
console.log('SQLite 迁移完成');
} else if (dialect === 'mysql') {
// MySQL 可以直接修改 ENUM
console.log('检测到 MySQL 数据库,直接修改 ENUM...');
await sequelize.query(`
ALTER TABLE users
MODIFY COLUMN status ENUM('active', 'inactive', 'locked', 'pending') DEFAULT 'active'
`);
console.log('MySQL 迁移完成');
} else {
console.log(`不支持的数据库类型: ${dialect},请手动迁移`);
}
console.log('迁移成功完成!');
} catch (error) {
console.error('迁移失败:', error);
process.exit(1);
}
}
migrate();