2014-06-19 4 views
5

Ich benutze Sequelize für meinen Server (mit Mysql-Dialekt); in Sequelize-Dokumentation wird geschrieben, dass dies:Fremdschlüssel mit Sequelize werden nicht erstellt

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

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

erstellt automatisch Fremdschlüssel Referenzen mit Einschränkungen; aber für mich dies nicht geschieht:

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); 

Dies schafft die beiden Tabellen Geschäfte und Angebote, die beide mit nur „id“ Primärschlüssel

Ich habe auch einige n: m Verbände wie:

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

aber auch in diesem Fall, in der Join-Tabelle, die Sequelize erstellt, gibt es keinen Fremdschlüssel; also, wenn ich für ex löschen. ein acccesslevel, als die entsprechenden Datensätze in der Join-Tabelle accesslevelsgroups nicht gelöscht werden.

Weiß jemand, ob ich etwas falsch mache oder etwas verpasse? Was ich brauche, ist es, alle Fremdschlüssel für die Verbände zu schaffen und die Möglichkeit, das Verhalten zu spezifizieren ‚onDelete‘ und ‚onUpdate‘ (Kaskade)

- UPDATE ich eine Route für die Ausführung sync erstellt haben:

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'); 
    }); 
}); 

So dann im Browser die DB-Struktur erstellen ich tippe 127.0.0.1:port/sync

+0

sequelize doesnt Unterstützung ausländische keys.You Notwendigkeit, sie selbst zu erstellen. – mpm

+1

@mpm Das ist blatelnly falsch, http://sequelizejs.com/docs/1.7.8/associations#foreign-keys –

+0

@ WillemD'haeseleer gut das war der Fall, als ich es verwendet habe, froh, dass es jetzt unterstützt wird. – mpm

Antwort

1

Haben Sie die Beziehung nach dem erstellen der Tabelle hinzufügen (in der Datenbank)?
Sie benötigen .sync({ force: true }), wenn Sie Ihr Schema ändern und Ihr Programm erneut ausführen. Sequelize erstellt nur die Tabelle und alle ihre Referenzen, wenn die Tabelle noch nicht in der Datenbank vorhanden ist.

Rufen Sie die Synchronisierung an, nachdem alle Verknüpfungen erstellt wurden?

Verwenden Sie InnoDB?

Seltsamerweise kann ich das reproduzieren, Die einfachste Lösung ist, den Schlüssel manuell zu definieren Ich denke, so habe ich es gelöst, Könnte ein Fehler sein sonst bin ich mir nicht sicher.

Siehe hier: http://sequelizejs.com/docs/latest/associations#block-3-line-24

+0

Ich definiere alle Assoziationen direkt nach den Modellen, wie im ersten Beitrag geschrieben; dann habe ich eine route/sync auf dem Server erstellt, der die sync ({force: true}) ausgeführt hat, und eine weitere route/dummy-data, die automatisch einige Datensätze einfügt; also laufe ich/sync und dann/dummy-data ... ich nutze InnoDB ... –

+0

Ich habe die Frage mit der Route aktualisiert ... –

+0

@CerealKiller Siehe meine aktualisierte Antwort –

Verwandte Themen