Sequelize ist ein versprechungsbasiertes ORM für Node. Weitere Informationen: http://docs.sequelizejs.com/

So definieren Sie Sequelize-Zuordnungen mithilfe von Migrationen

Die Sequelize-CLI eignet sich hervorragend zum Generieren von Modell- und Migrationsdateien, nicht jedoch zum Hinzufügen von Verknüpfungen mit anderen Modellen.

Leider gibt es nicht viel (eindeutige) Dokumentation zum Hinzufügen von Verknüpfungen in Migrationsdateien. Deshalb habe ich mich entschlossen, während ich das selbst herausgefunden habe, grundlegende Beispiele für die vier Arten von Verknüpfungen aufzuschreiben, um anderen die Zeit zu sparen.

Modelle erstellen

Ich empfehle, zuerst alle Modelle zu erstellen und dann Verknüpfungen in einer separaten Migrationsdatei hinzuzufügen. Dies verhindert Fehler bei Modellen, die noch nicht existieren. Dies hat sich für mich als der einfachste Weg erwiesen, die Datenbank in einen Anfangszustand zu versetzen.

Beispielreihenfolge von Dateien:

  • create-tags.js
  • create-products.js
  • create-orders.js
  • create-customers.js
  • create-payments.js
  • add-associations.js

Erstellen Sie alle Modelle und ihre Migrationen mit sequelize model: generate.

Um zu überprüfen, ob die Modelle korrekt erstellt wurden, schlage ich vor, sequelize db: migrate auszuführen und nach Fehlern zu suchen.

Hinweis: Wenn Sie die Fehlermeldung erhalten, dass der Dialekt explizit ab Version 4.0.0 bereitgestellt werden muss, exportieren Sie zuerst den NODE_ENV Ihrer Konfiguration, z. export NODE_ENV = "local"

Wenn keine Fehler vorliegen, können wir mit dem nächsten Schritt fortfahren.

Assoziationen hinzufügen

Abhängig von der Größe Ihres Projekts können Sie die Zuordnungen für jedes Modell aufteilen oder alle in einer Datei haben. Wenn ich ein Projekt starte, mache ich sie gerne alle in einer Datei, aber es hängt von den persönlichen Vorlieben ab und wie viele Assoziationen jedes Modell hat.

Zuerst erstellen wir die Migrationsdatei, in der wir alle Zuordnungen vornehmen:

gehört

Gemäß der Dokumentation fügt eine Gehör-zu-Beziehung der Quelle einen Fremdschlüssel und singuläre Assoziations-Mixins hinzu.

In unserem Beispiel gehört eine Bestellung einem Kunden. In diesem Fall lautet die Quelle "Bestellung". Daher müssen wir der Tabelle "Bestellung" einen CustomerId-Schlüssel hinzufügen.

Hinweis: Ich verwende UUIDs für meine IDs. Wenn Sie die Standard-Ganzzahlen verwenden, ändern Sie den Typ in DataTypes.INTEGER, entfernen Sie die defaultValue-Zeile und ändern Sie autoIncrement in true.

In unserer Migrationsdatei müssen wir eine Spalte namens CustomerId hinzufügen. Dies kann mit der queryInterface.addColumn-Methode erfolgen. Wir müssen auch eine Down-Funktion bereitstellen, die die Datenbank vor der Migration in den Status zurückversetzt.

Ein paar Dinge, die Sie hier beachten sollten:

  • Tabellennamen sind im Plural und der Referenzschlüssel entspricht genau dem Schlüssel, der beim Definieren der Modelle verwendet wird (meistens wird er verwendet).
  • Der Fremdschlüssel wird aktiviert.
  • Wir definieren auch onUpdate und onDelete. Die Standardeinstellung ist CASCADE für update und SET NULL für delete für belongTo, hasOne und hasMany. BelongsToMany-Zuordnungen haben standardmäßig CASCADE zum Aktualisieren und Löschen.

Hinweis: Wenn Sie anstelle von UUIDs Ganzzahlen verwenden, geben Sie Folgendes ein: Sequelize.INTEGER.

Speichern und starten Sie sequelize db: migrate. Wenn alles in Ordnung ist, lassen Sie uns sequelize db: migrate: undo ausführen, um zu überprüfen, ob die Undo-Funktion auch funktioniert.

hasOne

Wenn Sie eine hasOne-Beziehung definieren, wird der Fremdschlüssel zum Ziel hinzugefügt.

In unserem Beispiel hat Payment oneOrder. Da die Bestellung das Ziel ist, müssen wir dem Bestellmodell einen PaymentId-Schlüssel hinzufügen.

Fügen wir unsere Migration des hasOne-Schlüssels hinzu. Diese Migration wird an add-associations.js angehängt, sodass die gesamte Datei folgendermaßen aussieht:

Beachten Sie, dass wir die queryInterface-Methoden verketten, da sie Promises zurückgeben.

Führen Sie "sequelize db: migrate" erneut aus. Wenn es keine Fehler gibt, führen Sie sequelize db: migrate: undo aus, um zu überprüfen, ob unsere Down-Funktion auch funktioniert.

hat viele

Eine hasMany-Zuordnung erstellt eine 1: m-Zuordnung zwischen der Quelle und dem bereitgestellten Ziel. Der Fremdschlüssel wird dem Ziel hinzugefügt. “

In unserem Beispiel hat eine Bestellung viele Produkte. Aktualisieren wir die Modelldatei order.js.

Jetzt müssen wir die OrderId-Spalte zur Products-Tabelle in der Migrationsdatei hinzufügen:

Ziemlich einfach :)

Gehört zu vielen

Hier wird es etwas komplizierter. Eine belongToMany-Beziehung erstellt eine n: m-Zuordnung über eine Verknüpfungstabelle.

In unserem Beispiel gehört ein Produkt zu vielen Tags und umgekehrt. Hier sind die Modelldefinitionen:

Beachten Sie Folgendes:

  • Wir definieren durch: 'ProductTags'. Dies definiert, dass wir die n: m-Zuordnung in der ProductTags-Tabelle speichern.
  • In beiden Modellen definieren wir die belongToMany-Assoziation unter Verwendung des gleichen Through.

Um die Dinge übersichtlicher zu gestalten, erstelle ich eine neue Migrationsdatei für diese Zuordnung, indem ich folge der Migration: generate --name associate-product-tag.

Anstelle von queryInterface.addColumn müssen wir jetzt queryInterface.createTable verwenden.

Diese Tabelle benötigt keinen ID-Schlüssel. Bitte beachten Sie, dass ProductId und TagId beide Primärschlüssel sind. Für die Down-Funktion lassen wir den Tisch einfach wieder fallen.

Führen Sie sequelize db: migrate erneut aus und prüfen Sie, ob es funktioniert. Vergessen Sie nicht, die Down-Funktion zu testen, indem Sie sequelize db: migrate: undo ausführen.

Erledigt

Das ist es! Ich hoffe, dass diese grundlegenden Beispiele helfen und Ihnen Zeit sparen. Wenn Sie Fragen haben, zögern Sie nicht zu fragen.