10

我在我的 nodejs 应用程序中使用了 sequelize ORM,当我删除表时,它似乎以错误的顺序删除了表sequelize.sync({force: true})

例如,使用:

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

之后我得到以下日志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

似乎以错误的顺序删除表。

4

4 回答 4

23

与来宾相同的答案,但没有外部要求。

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);
});
于 2014-02-07T23:34:39.047 回答
6

在执行之前禁用外键检查sequelize.sync({force: true})

例如:

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);
于 2014-01-08T21:26:49.740 回答
3

这对我有用:

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);
});
于 2014-08-29T21:46:07.037 回答
0

这适用于我的模型和关系。

/* 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();
于 2013-10-28T17:44:40.563 回答