web-dev-qa-db-fra.com

Associations dans les migrations Sequelize

Mon application utilise actuellement la méthode Sequelize sync() pour créer la base de données et je souhaite la modifier pour utiliser le système de migration.

Un de mes modèles a des associations belongsTo() avec d'autres modèles et je ne sais pas vraiment comment créer le code de migration initial pour ces associations.

Dois-je créer manuellement la clé étrangère avec des requêtes SQL ou existe-t-il des méthodes disponibles? 

14
loics2

Cas 1: Initialisation de la base de données

Si votre objectif est d'ajouter des relations lors de l'initialisation de la structure de la base de données, il est préférable d'utiliser la méthode sync au lieu de les ajouter manuellement à l'aide de migrations. Si vos modèles sont correctement conçus et que des relations sont définies, ils seront créés automatiquement lors de l'exécution de la méthode sync.

Jetez un coup d'œil à exemple séquentiel d'exception . Dans le répertoire models, vous avez trois fichiers:

  • index.js - qui inclut tous les modèles
  • task.js - modèle de tâche
  • user.js - modèle d'utilisateur

Regardez le contenu de task.js, à partir de la ligne 7, le code suivant crée une relation entre les modèles utilisateur et tâche:

classMethods: {
  associate: function(models) {
    Task.belongsTo(models.User, {
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    });
  }
}

Si vous préparez correctement vos relations dans les fichiers de modèle, sync créera les clés étrangères pour vous. Les migrations ne sont pas nécessaires dans ce cas.

Je vous encourage à lire l'intégralité de l'exemple-exemple readme.md et à parcourir les fichiers du référentiel pour voir comment les choses fonctionnent avec express et séquelles.

Cas 2: Migration de la structure de base de données

Si vous souhaitez déjà conserver certaines données, vous devez utiliser un script de migration, car le seul moyen de synchroniser votre base de données est de la détruire complètement avec toutes ses données.

Vous pouvez en savoir plus sur les migrations de base dans la suite de la documentation . Malheureusement, les documents ne couvrent pas la création d'une relation. Supposons que vous souhaitiez créer la relation suivante: L'utilisateur appartient au groupe. Pour créer une colonne du côté utilisateur de la relation, vous pouvez utiliser la méthode addColumn.

queryInterface.addColumn(
  'user',
  'group_id',
  {
    type: Sequelize.INTEGER,
    allowNull: true
  }
)

Malheureusement, il n’existe pas (encore) de fonction Nice pour créer la contrainte de clé étrangère pour vous, mais vous pouvez le faire manuellement à l’aide de la méthode de requête Sequelize. Exemple Postgresql:

queryInterface.sequelize.query("ALTER TABLE user
  ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id)
  REFERENCES group (id) MATCH SIMPLE
  ON UPDATE CASCADE ON DELETE CASCADE;");

Edition: Ajout du cas de migration de la structure de base de données

12
ezpn

Après de nombreuses recherches, j'ai trouvé quelques articles de blog expliquant ce que je voulais faire.

Apparemment, ce n'est pas vraiment la façon habituelle de le faire, mais cela me semble plus logique. Si vous souhaitez utiliser uniquement les migrations, vous devez utiliser des requêtes SQL pour créer la migration initiale.

Voici les messages: le premier , inspiré par celui-ci .

Quoi qu'il en soit, je pense que ezrepotein a raison de créer la base de données initiale avec Sync, puis de migrer. Cela semble plus facile que d'utiliser umzug et d'utiliser uniquement les migrations.

2
loics2

Ajouter ceci comme réponse plutôt que comme commentaire (pas assez de représentants) pour la réponse @ aryeh-armon ci-dessus. C'est le nom de la table dont vous avez besoin pour vous assurer qu'il existe plutôt que le nom du modèle. Si votre modèle s'appelle Job et que votre table de base de données s'appelle Jobs, la migration ressemblera à ceci. 

jobId: {
type: Sequelize.INTEGER,
references: {
    model: "Jobs",
    key: "id"
  }
},
1
adamS

vous pouvez ajouter des références aux migrations

Exemple:

user_id: {
    type: Sequelize.BIGINT,
    references: {
        model: "users",
        key: "id"
    }
},

Assurez-vous simplement que le modèle que vous référencez existe.

0
Aryeh Armon