Maison >interface Web >js tutoriel >Pourquoi Sequelize ne parvient-il parfois pas à créer des colonnes de modèle associées et comment puis-je y remédier ?

Pourquoi Sequelize ne parvient-il parfois pas à créer des colonnes de modèle associées et comment puis-je y remédier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 21:13:16519parcourir

Why Does Sequelize Sometimes Fail to Create Associated Model Columns, and How Can I Fix It?

Différences de création de colonnes d'association de modèles Sequelize

Dans Sequelize, les associations de modèles établissent des relations entre différents modèles. Cependant, les utilisateurs ont signalé des incohérences dans lesquelles Sequelize ne parvient pas à créer la colonne de clé étrangère attendue pour certains modèles mais réussit pour d'autres. Cet article examine les raisons possibles et propose une solution pour résoudre ce problème.

La question initiale découle d'un modèle dans lequel Sequelize n'a pas créé la colonne role_id pour l'association du modèle utilisateur avec le modèle de rôle. Malgré les tentatives de diverses méthodes de dépannage, le problème persiste.

La solution consiste à garantir que tous les modèles et leurs associations sont enregistrés dans un emplacement central. Ce faisant, vous pouvez vous assurer que Sequelize a une connaissance complète de toutes les relations des modèles et peut créer les colonnes nécessaires lors de la synchronisation avec la base de données.

Enregistrement centralisé des modèles

Le L'approche recommandée consiste à créer un fichier database.js et à y enregistrer tous les modèles. Voici un exemple de fichier 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;

Dans ce fichier :

  • models est le répertoire où se trouvent vos fichiers de modèle.
  • sequelize est initialisé avec les paramètres de connexion requis.
  • Les modèles sont importés et enregistrés avec leurs noms respectifs en tant que propriétés de la base de données objet.
  • La fonction associée est appelée pour chaque modèle qui a des associations pour établir les relations.

Accès aux modèles

Une fois que vous avez centralisé l'enregistrement de votre modèle, vous pouvez y accéder dans d'autres modules en utilisant l'objet db exporté depuis database.js. Voici un exemple d'utilisation du modèle utilisateur :

const db = require('../database');
...
const users = await db.user
   .findAll({
     where: {
      [db.Sequelize.Op.or]: [{
        first_name: 'Smith'
      }, {
        last_name: 'Smith'
      }]
     }
})

En centralisant l'enregistrement du modèle et en vous assurant que les associations sont correctement définies, vous pouvez résoudre le problème de création de colonnes incohérentes et maintenir une infrastructure de modèle propre et cohérente.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn