120 lines
3.4 KiB
JavaScript
120 lines
3.4 KiB
JavaScript
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();
|