2014-06-19 2 views
5

Uso Sequelize per il mio server (con dialetto mysql); nella documentazione di Sequelize è scritto che questo:Le chiavi esterne con Sequelize non vengono create

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

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

crea automaticamente riferimenti a chiavi esterne con vincoli; ma per me questo non accade:

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

Questo crea i due negozi e le offerte tavoli, entrambi con solo "id" chiave

Ho anche qualche n primarie: m associazioni come:

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

ma anche in questo caso, nella tabella di join creata da Sequelize, non ci sono chiavi esterne; quindi se cancello per ex. un acccesslevel, che i record corrispondenti nella tabella join accesslevelsgroups non vengono cancellati.

Qualcuno sa se sto facendo qualcosa di sbagliato o manca qualcosa? Che cosa ho bisogno è quello di creare tutte le chiavi esterne per le associazioni e la possibilità di specificare il comportamento 'onDelete' e 'onUpdate' (cascata)

- UPDATE Ho creato un percorso per la sincronizzazione eseguendo:

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

allora nel browser tipo I 127.0.0.1:port/sync per creare la struttura db

+0

sostegno doesnt sequelize estera keys.You necessità di creare da soli. – mpm

+1

@mpm Che è blatelnly errato, http://sequelizejs.com/docs/1.7.8/associations#foreign-keys –

+0

@ WillemD'haeseleer bene che è stato il caso in cui l'ho usato, felice che ora sia supportato. – mpm

risposta

1

Forse si aggiunge il rapporto, dopo la creazione della tabella (nel database)?
È necessario .sync({ force: true }) se si modifica lo schema e si esegue nuovamente il programma. Sequelize creerà solo la tabella e tutti i suoi riferimenti se la tabella non esiste ancora nel database.

Stai chiamando la sincronizzazione dopo che sono state create tutte le associazioni?

Stai utilizzando InnoDB?

Stranamente riesco a riprodurlo, La soluzione più semplice è definire manualmente la chiave Penso che sia così che l'ho risolto, potrebbe essere un bug altrimenti non ne sono sicuro.

Vedi qui: http://sequelizejs.com/docs/latest/associations#block-3-line-24

+0

Definisco tutte le associazioni subito dopo i modelli, come scritto nel primo post; poi ho creato una route/sync nel server che ha eseguito la sincronizzazione ({force: true}), e un'altra route/dummy-data che inserisce automaticamente alcuni record; quindi eseguo/sync e quindi/dummy-data ... Io uso InnoDB ... –

+0

Ho aggiornato la domanda con il percorso ... –

+0

@CerealKiller Vedi la mia risposta aggiornata –