2015-04-27 7 views
15

tlePisanie Migracje z klawiszami z zagranicznych w SeqelizeJS

Buduję projekt z SequelizeJS, popularnej ORM dla NodeJS. Podczas projektowania schematu pojawiają się dwa smaki taktyki:

  1. Utwórz kod modelu i użyj funkcji .sync(), aby automatycznie generować tabele dla swoich modeli.
  2. Utwórz kod modelu i napisz kod manual migrations, używając QueryInterface i umzug.

Rozumiem, że nr 1 jest lepszy w przypadku szybkiego prototypowania, ale że # 2 to najlepsza praktyka w przypadku projektów, które mają z czasem podlegać iteracji, w których dane produkcyjne muszą być w stanie przetrwać migracje.

To pytanie dotyczy taktyki nr 2.

Pytanie (s)

Moi tabele mają relacje, które muszą zostać uwzględnione przez kluczy obcych.

  • Jak utworzyć tabele ze związanymi kluczami obcymi między sobą za pomocą Sequelize QueryInterface?

  • Jakie kolumny i tabele pomocnicze są wymagane do kontynuacji? Na przykład wygląda na to, że oczekiwane są określone kolumny, takie jak createdAt lub updatedAt.

Odpowiedz

15

Jak mogę utworzyć tabele z klucza obcego relacji z sobą poprzez Sequelize QueryInterface?

Metoda .createTable() przyjmuje słownik kolumn. Listę poprawnych atrybutów można zobaczyć w pliku documentation for .define(), w szczególności patrząc na wiersze [attributes.column.*] w tabeli parametrów.

Aby utworzyć atrybut z relacji klucza obcego, należy użyć „referencje” i „referencesKey” pola:

Na przykład, co następuje stworzyłoby users stół, a user_emails tabela, która odwołuje się do tabeli użytkowników.

queryInterface.createTable('users', { 
    id: { 
    type: Sequelize.INTEGER, 
    primaryKey: true, 
    autoIncrement: true 
    } 
}).then(function() { 
    queryInterface.createTable('user_emails', { 
    userId: { 
     type: Sequelize.INTEGER, 
     references: { model: 'users', key: 'id' } 
    } 
    }) 
}); 

Co kolumny i tabele pomocnicze są wymagane przez sequelize? Na przykład wygląda na to, że oczekiwane są określone kolumny, takie jak createdAt lub updatedAt.

Wydaje się, że standardowy model będzie oczekiwać id, updatedAt i createdAt kolumnę dla każdej tabeli.

queryInterface.createTable('users', { 
    id: { 
    type: Sequelize.INTEGER, 
    primaryKey: true, 
    autoIncrement: true 
    }, 
    createdAt: { 
    type: Sequelize.DATE 
    }, 
    updatedAt: { 
    type: Sequelize.DATE 
    } 
} 

Jeśli masz paranoiczne: prawdziwy zestaw modelu, będzie trzeba także deletedAt znacznik czasu.

+3

Dla osoby kończące się tutaj, to odpowiedź jest w porządku, ale składnia jest już przestarzała, użyj następujących: _references: { modelu:, klucz „użytkownicy” : 'id' } _ – PhilippeAuriach

+0

Dzięki @PhilippeAuriach Zaktualizuję teraz – slifty

+0

powinieneś również usunąć _referencesKey: 'id'_;) – PhilippeAuriach

2

Chcę zaoferować inny więcej ręcznego alternatywną ponieważ podczas używania ręcznych migracje i QueryInterface natknąłem się na następujący problem: Miałem 2 pliki w folderze migracji jak tak

migrations/create-project.js 
migrations/create-projectType.js 

ponieważ project miał kolumnę projectTypeId odwołał się do projectType, który nie został jeszcze utworzony ze względu na kolejność plików, co spowodowało błąd.

Rozwiązałem go, dodając ograniczenie klucza obcego po utworzeniu obu tabel. W moim przypadku zdecydowałem się napisać go wewnątrz create-projectType.js:

queryInterface.createTable('project_type', { 
    // table attributes ... 
}) 
.then(() => queryInterface.addConstraint('project', ['projectTypeId'], { 
    type: 'FOREIGN KEY', 
    name: 'FK_projectType_project', // useful if using queryInterface.removeConstraint 
    references: { 
    table: 'project_type', 
    field: 'id', 
    }, 
    onDelete: 'no action', 
    onUpdate: 'no action', 
})) 
+1

Nice! jedna uwaga - możesz zastanowić się nad nazwaniem swoich migracji za pomocą poleceń, aby uruchomić nazwę pliku, aby upewnić się, że są one przetwarzane w pożądanej kolejności, niezależnie od nazwy tabeli (np. '01-create-projecttype.js',' 02-create-project .js'). Jest to również ważne, ponieważ podczas edycji/dodawania tabel możesz zachować starsze kroki migracji (np. '03-edit-projecttype.js'). – slifty

+1

@slifty dziękuję - faktycznie zacząłem właśnie to robić! nadzieja v4 cli obsługuje wiele folderów migracji – galki

Powiązane problemy