2013-07-23 13 views
9

używam ORM sequelize w moim nodejs aplikacji i wydaje się, że spadnie stolik w niewłaściwej kolejności, kiedy sequelize.sync({force: true})Sequelize stół kropla w niewłaściwej kolejności

Na przykład z:

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 uzyskać następujące dzienniki po 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 

wydaje się być upuszczanie tabel w niewłaściwej kolejności.

+0

Czy wymyślić rozwiązanie tego problemu? – rOrlig

+0

Jeszcze nie ..... :-( –

Odpowiedz

0

To zadziałało dla moich modeli i relacji.

/* 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

Wyłącz klucz obcy sprawdza przed wykonaniem sequelize.sync({force: true})

na przykład:

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

samą odpowiedź jako gość, ale bez wymagań zewnętrznych.

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

Próbowałem twojej odpowiedzi.Czy czasami daje błąd, ale czasami nie ma.Jest problem z asynchronicznymi zadaniami? – Burak

+0

Jaki błąd otrzymujesz? Być może będziesz musiał ustawić 'maxConcurrentQueries 'to 1. –

+0

Próbowałem sequelize.options.maxConcurrentQueries = 1 przed synchronizacją, ale nic się nie zmieniło – Burak

2

Ten pracował dla mnie:

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

Nie, znowu nie działa ... – Burak

+0

działało dobrze dla mnie, spróbuj użyć. then zamiast .success –