2013-07-23 16 views
9

Sto usando l'ORM sequelize nella mia app nodejs e sembra che si scende tavolo nell'ordine sbagliato quando ho sequelize.sync({force: true})Sequelize tavolo calo nell'ordine sbagliato

Ad esempio, con:

var StationEntity = sequelize.define('Station', { 
    id: { type: Sequelize.INTEGER, primaryKey: true, allowNull: false}, 
    name: { type: Sequelize.STRING, allowNull: false} 
}) 

var StationSnapshotEntity = sequelize.define('StationSnapshot', { 
    id: { type: Sequelize.BIGINT, autoIncrement: true, primaryKey: true}, 
    snapshotTimestamp: { type: Sequelize.BIGINT, allowNull: false} 
}) 

StationEntity.hasMany(StationSnapshotEntity, {as: 'Snapshots', foreignKeyConstraint: true, allowNull: false}) 

I ottenere i seguenti registri dopo sequelize.sync({force: true}):

Executing: DROP TABLE IF EXISTS `Stations`; 
Executing: DROP TABLE IF EXISTS `StationSnapshots`; 
Executing: CREATE TABLE IF NOT EXISTS `StationSnapshots` (`id` BIGINT auto_increment , `snapshotTimestamp` BIGINT NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `StationId` INTEGER, PRIMARY KEY (`id`), FOREIGN KEY (`StationId`) REFERENCES `Stations` (`id`)) ENGINE=InnoDB; 

Error: ER_ROW_IS_REFERENCED: Cannot delete or update a parent row: a foreign key constraint fails 

sembra essere caduta tabelle nell'ordine sbagliato.

+0

Hai capire una soluzione per questo? – rOrlig

+0

non ancora ..... :-( –

risposta

0

Questo ha funzionato per i miei modelli e le mie relazioni.

/* the models in the array are declared on the basis of relationships */ 
var models = [ 
    'User', 
    'State', 
    'Party', 
    'Politician', 
    'Constituency', 
    'Award', 
    'Comment', 
    'Favorite', 
    'Rating' 


]; 

models.forEach(function(model) { 
    //need to drop things to make sure the order is maintained while droping tables... 
    module.exports[model] = sequelize.import(__dirname + '/' + model); 
}); 

/*** setup relationships ***/ 
(function(m) { 
    m.Award.belongsTo(m.Politician, {foreignKey: 'award_politician_id', 
            as: 'politician_id',foreignKeyConstraint:true}); 
    m.Politician.hasMany(m.Award, {foreignKey: 'award_politician_id',foreignKeyConstraint:true}); 


    m.Comment.belongsTo(m.User, {foreignKey: 'comment_user_id', 
           as: 'user_id',foreignKeyConstraint:true}); 
    m.Comment.belongsTo(m.Politician, {foreignKey: 'comment_politician_id', 
             foreignKeyConstraint:true}); 
    m.Politician.hasMany(m.Comment, {foreignKey: 'comment_politician_id', 
            foreignKeyConstraint:true}); 
    m.User.hasMany(m.Comment, {foreignKey: 'comment_user_id', 
           foreignKeyConstraint:true}); 

    m.Favorite.belongsTo(m.User, {foreignKey: 'favorite_user_id', 
            as: 'user_id',foreignKeyConstraint:true}); 
    m.Favorite.belongsTo(m.Politician, {foreignKey: 'favorite_politician_id', 
             as: 'politician_id',foreignKeyConstraint:true}); 
    m.Politician.hasMany(m.Favorite,{foreignKey: 'favorite_politician_id', 
            foreignKeyConstraint:true}); 
    m.User.hasMany(m.Favorite, {foreignKey: 'favorite_user_id', 
           foreignKeyConstraint:true}); 

    m.Rating.belongsTo(m.User, {foreignKey: 'rating_user_id', 
           as: 'user_id',foreignKeyConstraint:true}); 
    m.Rating.belongsTo(m.Politician, {foreignKey: 'rating_politician_id', 
             as: 'user_id',foreignKeyConstraint:true}); 
    m.Politician.hasMany(m.Rating, {foreignKey: 'rating_politician_id', 
            foreignKeyConstraint:true} 
         ); 
    m.User.hasMany(m.Rating, {foreignKey: 'rating_user_id', 
      foreignKeyConstraint:true} 
    ); 


    m.Constituency.belongsTo(m.State, {foreignKey: 'constituency_state_id', 
             as: 'state_id',foreignKeyConstraint:true}); 
    m.State.hasMany(m.Constituency,{foreignKey: 'constituency_state_id', foreignKeyConstraint:true}); 

    m.Politician.belongsTo(m.Party, { foreignKey: 'politician_party_id', 
             as: 'party_id', 
             foreignKeyConstraint:true}); 
    m.Party.hasMany(m.Politician, {foreignKey: 'politician_party_id', foreignKeyConstraint:true}); 
// m.User.drop(); 
// 
// sequelize.sync(); 


})(module.exports); 
/** drop existing relationships manually in reverse order**/ 
models.reverse().forEach(function(model) { 

    sequelize.import(__dirname + '/' + model).drop().success(function(){ 
    console.log("success model:" + model); 

    }).error(function(error){ 
     console.log("model:" + model + " error:" + error); 
    }); 
}); 
/** sync **/ 
sequelize.sync(); 
4

Disattiva controlli chiave esterna prima di fare sequelize.sync({force: true})

Per esempio:

async.series([ 
    function(callback) { 
    sequelize.query("SET FOREIGN_KEY_CHECKS = 0").complete(callback); 
    }, 
    function(callback) { 
    sequelize.sync({force: true}).complete(callback); 
    }, 
    function(callback) { 
    sequelize.query("SET FOREIGN_KEY_CHECKS = 1").complete(callback); 
    }] 
, callback); 
20

Stessa risposta come ospite ma senza requisiti esterni.

db.query('SET FOREIGN_KEY_CHECKS = 0') 
.then(function(){ 
    return db.sync({ force: true }); 
}) 
.then(function(){ 
    return db.query('SET FOREIGN_KEY_CHECKS = 1') 
}) 
.then(function(){ 
    console.log('Database synchronised.'); 
}, function(err){ 
    console.log(err); 
}); 
+0

Ho provato la tua risposta Qualche volta dà errore, ma a volte no.È un problema con le attività asincrone? – Burak

+0

Che errore stai ottenendo? Potrebbe essere necessario impostare 'maxConcurrentQueries 'a 1. –

+0

Ho provato sequelize.options.maxConcurrentQueries = 1 prima della sincronizzazione, ma non è cambiato nulla – Burak

2

Questo ha funzionato per me:

sequelize.query('SET FOREIGN_KEY_CHECKS = 0').success(function() { 
    sequelize 
     .sync({ 
      force: true 
     }).success(function() { 
      sequelize.query('SET FOREIGN_KEY_CHECKS = 1').success(function() { 
       console.log('Database synchronised.'); 
      }); 
     }).error(function(err) { 
      console.log(err); 
     });; 
}).error(function(ee) { 
    console.log(err); 
}); 
+0

No. di nuovo non funziona ... – Burak

+0

ha funzionato bene per me. prova a utilizzare. poi al posto di .successo –

Problemi correlati