Sequelize 模型关联未创建外键列
在 Sequelize 中,关联定义两个或多个模型之间的关系。它提供了一种访问相关数据和执行复杂查询的便捷方法。但是,某些用户遇到 Sequelize 不会为特定模型创建外键列的问题。尽管其他模型具有相同的关联定义,但还是会出现此问题。
了解外键创建
当两个模型之间建立关联时,Sequelize 将自动创建外键列。当在关联选项中指定foreignKey 属性时,会发生这种情况。例如,在提供的 User 模型中,belongsTo 关联是使用 role_id 的foreignKey 定义的。通常,这会导致在 User 表中创建 role_id 列。
解决问题
此问题的解决方案在于确保所有模型都在一个中心位置进行注册和关联。通过集中模型注册和关联,Sequelize 可以正确处理依赖关系并创建必要的外键列。
实现集中模型注册和关联
以下代码演示了如何在单个文件中注册和关联模型:
// database.js // Register all models in one place const fs = require('fs'); const path = require('path'); const Sequelize = require('sequelize'); const db = {}; const models = path.join(__dirname, 'models'); // Create a Sequelize instance const sequelize = new Sequelize(/* your connection settings here */); // Register models and add them to the db object fs. readdirSync(models). filter(function (file) { return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); }). forEach(function (file) { // Sequelize version <= 5.x var model = sequelize['import'](path.join(models, file)); // Sequelize version >= 6.x // var model = require(path.join(models, file))( // sequelize, // Sequelize.DataTypes // ); db[model.name] = model; }); // Associate models within the db object Object.keys(db).forEach(function (modelName) { if (db[modelName].associate) { db[modelName].associate(db); } }); db.Sequelize = Sequelize; // for accessing static props and functions like Op.or db.sequelize = sequelize; // for accessing connection props and functions like 'query' or 'transaction' module.exports = db;
用法示例
在代码库的其他模块中,您可以访问集中式数据库连接并使用注册的模型,如下所示:
const db = require('../database'); const { Op } = require('sequelize'); // Use models defined in database.js const users = await db.user.findAll({ where: { [Op.or]: [ { first_name: 'Smith' }, { last_name: 'Smith' } ] } });
通过遵循这些准则,您可以确保您的所有 Sequelize 模型都正确关联,并且创建了适当的外键列。
以上是为什么 Sequelize 不在模型关联中创建我的外键列?的详细内容。更多信息请关注PHP中文网其他相关文章!