2014-06-19 23 views
5

Używam Sequelize dla mojego serwera (z mysql dialektem); w dokumentacji Sequelize jest napisane, że:Klucze obce z Sequelize nie są tworzone

var Task = this.sequelize.define('Task', { title: Sequelize.STRING }) 
, User = this.sequelize.define('User', { username: Sequelize.STRING }) 

User.hasMany(Task) 
Task.belongsTo(User) 

tworzy automatycznie klucze obce z ograniczeniami; ale dla mnie to nie nastąpi:

var Shop = sequelize.define('Shop', { 
    name: Sequelize.STRING, 
    address: Sequelize.STRING, 
    phone: Sequelize.STRING, 
    email: Sequelize.STRING, 
    percentage: Sequelize.FLOAT, 
    text: Sequelize.TEXT, 
    categories: Sequelize.TEXT, 
    start: Sequelize.DATE, 
    end: Sequelize.DATE 
}); 

var Offer = sequelize.define('Offer', { 
    name: Sequelize.STRING, 
    deadline: Sequelize.DATE, 
    optionDuration: Sequelize.INTEGER 
}); 

Shop.hasMany(Offer); 
Offer.belongsTo(Shop); 

Stwarza to dwie tablice sklepów i oferty, zarówno z nich tylko „id” klucza podstawowego

Mam też trochę n: m stowarzyszeń, takich jak:

Group.hasMany(Accesslevel); 
Accesslevel.hasMany(Group); 

ale również w tym przypadku w tabeli sprzężenia, którą tworzy Sequelize, nie ma klucza obcego; , więc jeśli usunę to za przykład. jeden poziom, niż odpowiadające rekordy w grupach dostępu accesslevelsgroups nie są usuwane.

Czy ktoś wie, czy robię coś złego, czy czegoś brakuje? Co potrzebne jest do stworzenia wszystkich kluczy obcych dla stowarzyszeń i możliwość określenia zachowania „” oraz „OnDelete onUpdate” (kaskadowy)

- UPDATE Utworzyłem drogę do wykonywania synchronizacji:

myServer.get('/sync', function (req, res) { 
    sequelize.sync({force: true}).success(function() { 
     console.log('sync done'); 
     res.send(200, 'sync done'); 
    }).error(function(error) { 
     console.log('there was a problem'); 
     res.send(200, 'there was a problem'); 
    }); 
}); 

Więc w przeglądarce wpisuję 127.0.0.1:port/sync aby utworzyć strukturę db

+0

wsparcie robi sequelize zagranicznych keys.You trzeba je stworzyć samemu. – mpm

+1

@mpm To jest blatelnly niepoprawne, http://sequelizejs.com/docs/1.7.8/associations#foreign-keys –

+0

@ WillemD'haeseleer dobrze, że tak było, kiedy go użyłem, cieszę się, że jest teraz obsługiwane. – mpm

Odpowiedz

1

Czy dodać relację po utworzeniu tabeli (w bazie danych)?
Potrzebujesz, jeśli chcesz zmodyfikować swój schemat i ponownie uruchomić program, potrzebujesz .sync({ force: true }). Sequelize utworzy tylko tabelę i wszystkie jej odniesienia, jeśli tabela nie istnieje jeszcze w bazie danych.

Czy dzwonisz po synchronizacji po utworzeniu wszystkich powiązań?

Czy używasz InnoDB?

Co dziwne, mogę to odtworzyć, Najłatwiejszą metodą jest ręczne zdefiniowanie klucza. Myślę, że tak to rozwiązałem. Może to być błąd, w przeciwnym razie nie jestem pewien.

Zobacz tutaj: http://sequelizejs.com/docs/latest/associations#block-3-line-24

+0

Definiuję wszystkie asocjacje zaraz po modelach, jak napisałem w pierwszym poście; następnie utworzyłem trasę/synchronizację na serwerze, który wykonał synchronizację ({force: true}) i inną trasę/dane-dummy, które automatycznie wstawiają niektóre rekordy; więc uruchamiam/synchronizuję, a następnie/dummy-data ... Używam InnoDB ... –

+0

Zaktualizowałem pytanie o trasę ... –

+0

@CerealKiller Zobacz moją zaktualizowaną odpowiedź –

Powiązane problemy