121 lines
3.4 KiB
JavaScript
121 lines
3.4 KiB
JavaScript
/**
|
||
* 同步 job_postings 表结构
|
||
* 用于创建或更新数据库表
|
||
*/
|
||
|
||
const Sequelize = require('sequelize');
|
||
|
||
// 加载配置
|
||
const config = require('../config/config');
|
||
const dbConfig = config.db;
|
||
|
||
async function syncJobPostingsTable() {
|
||
console.log('🔄 开始同步 job_postings 表结构...\n');
|
||
|
||
try {
|
||
// 创建 Sequelize 实例
|
||
const sequelize = new Sequelize(
|
||
dbConfig.database,
|
||
dbConfig.username,
|
||
dbConfig.password,
|
||
{
|
||
host: dbConfig.host,
|
||
port: dbConfig.port,
|
||
dialect: dbConfig.dialect,
|
||
logging: false
|
||
}
|
||
);
|
||
|
||
// 测试连接
|
||
await sequelize.authenticate();
|
||
console.log('✅ 数据库连接成功\n');
|
||
|
||
// 加载模型定义
|
||
const job_postings = require('../api/model/job_postings')(sequelize);
|
||
|
||
// 同步表结构(alter: true 会自动添加缺失的字段,保留现有数据)
|
||
console.log('⚠️ 注意:使用 alter: true 模式同步(保留现有数据)');
|
||
console.log('如果需要完全重建表,请修改为 force: true\n');
|
||
|
||
await job_postings.sync({ alter: true });
|
||
|
||
console.log('✅ job_postings 表同步成功!\n');
|
||
|
||
// 显示表结构
|
||
const tableInfo = await sequelize.query(
|
||
`DESCRIBE job_postings`,
|
||
{ type: Sequelize.QueryTypes.SELECT }
|
||
);
|
||
|
||
console.log('📋 当前表结构:');
|
||
console.table(tableInfo.map(field => ({
|
||
字段名: field.Field,
|
||
类型: field.Type,
|
||
允许空: field.Null,
|
||
默认值: field.Default
|
||
})));
|
||
|
||
// 检查关键字段
|
||
const requiredFields = [
|
||
'id',
|
||
'sn_code',
|
||
'platform',
|
||
'keyword',
|
||
'encryptBossId',
|
||
'jobId',
|
||
'jobTitle',
|
||
'companyId',
|
||
'companyName',
|
||
'companySize',
|
||
'companyIndustry',
|
||
'salary',
|
||
'jobRequirements',
|
||
'jobDescription',
|
||
'location',
|
||
'experience',
|
||
'education',
|
||
'aiMatchScore',
|
||
'applyStatus',
|
||
'chatStatus',
|
||
'originalData'
|
||
];
|
||
const existingFields = tableInfo.map(f => f.Field);
|
||
|
||
console.log('\n🔍 检查关键字段:');
|
||
const missingFields = [];
|
||
requiredFields.forEach(field => {
|
||
const exists = existingFields.includes(field);
|
||
console.log(` ${exists ? '✅' : '❌'} ${field}`);
|
||
if (!exists) {
|
||
missingFields.push(field);
|
||
}
|
||
});
|
||
|
||
if (missingFields.length > 0) {
|
||
console.log('\n⚠️ 缺少以下字段:', missingFields.join(', '));
|
||
console.log('建议:重新运行同步或手动添加这些字段');
|
||
} else {
|
||
console.log('\n✅ 所有必需字段都存在!');
|
||
}
|
||
|
||
// 关闭连接
|
||
await sequelize.close();
|
||
|
||
} catch (error) {
|
||
console.error('❌ 同步失败:', error.message);
|
||
console.error('\n详细错误:', error);
|
||
}
|
||
}
|
||
|
||
// 执行同步
|
||
syncJobPostingsTable()
|
||
.then(() => {
|
||
console.log('\n✨ 同步完成!');
|
||
process.exit(0);
|
||
})
|
||
.catch(error => {
|
||
console.error('\n💥 执行失败:', error);
|
||
process.exit(1);
|
||
});
|
||
|