Sequelize モデルの関連付け列作成の不一致
Sequelize では、モデルの関連付けにより、異なるモデル間の関係が確立されます。ただし、ユーザーは、Sequelize が特定のモデルでは予期された外部キー列の作成に失敗するが、他のモデルでは成功するという不一致を報告しています。この記事では、考えられる理由を詳しく調べ、この問題を解決するための解決策を提供します。
元の質問は、Sequelize が User モデルとロール モデルの関連付けのための role_id 列を作成しなかったモデルから生じました。さまざまなトラブルシューティング方法を試したにもかかわらず、問題は解決しませんでした。
解決策は、すべてのモデルとその関連付けが 1 つの中央の場所に登録されていることを確認することです。これにより、Sequelize がすべてのモデルの関係を完全に把握し、データベースとの同期中に必要な列を作成できるようになります。
集中モデル登録
推奨されるアプローチは、database.js ファイルを作成し、そのファイル内にすべてのモデルを登録することです。以下は、database.js ファイルの例です。
const fs = require('fs'); const path = require('path'); const Sequelize = require('sequelize'); const db = {}; const models = path.join(__dirname, 'models'); const sequelize = new Sequelize(/* your connection settings here */); 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; }); 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;
このファイル内:
モデルへのアクセス
モデルの登録が一元化されている場合は、database.js からエクスポートされた db オブジェクトを使用して、他のモジュールからモデルにアクセスできます。ユーザー モデルの使用例を次に示します。
const db = require('../database'); ... const users = await db.user .findAll({ where: { [db.Sequelize.Op.or]: [{ first_name: 'Smith' }, { last_name: 'Smith' }] } })
モデルの登録を一元化し、関連付けが適切に定義されていることを確認することで、一貫性のない列作成の問題を解決し、クリーンで一貫性のあるモデル インフラストラクチャを維持できます。
以上がSequelize が関連付けられたモデル列の作成に失敗する場合があるのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。