如何使sequelize.sync()省略一些模型?

时间:2017-02-10 12:46:47

标签: mysql node.js database sequelize.js

我在我的数据库(mysql)中使用表和视图,因此对于dev / test环境,我想使用sync(),但它在视图上崩溃。

我可以以某种方式省略这些模型吗?

4 个答案:

答案 0 :(得分:5)

当我想创建和使用Sequelize视图时,我使用的方法与Crusader的答案非常相似。在这种情况下,我不想让Sequelize尝试同步视图,因为它会导致创建一个表。为此,我将以下内容添加到Sequelize模型中:

var MyView = sequelize.define("MyView", {
  status: { type: DataTypes.TEXT },
},
{
  doNotSync: true,
  tableName: "myDatabaseView", // The actual view name in database
  classMethods: {
    createView: function(models) {
      return sequelize.query("CREATE OR REPLACE VIEW myDatabaseView ...;");
    }
});

现在我有了这个设置,我需要确保在创建数据库时不包含视图,并且在每个视图上调用createView方法。

var tables = [];
sequelize.modelManager.forEachModel(m => {
    if (m.options.doNotSync !== true) {
      tables.push(m);
    }              
});

return Sequelize.Promise.each(tables, t => {

  return t.sync({force: true});

}).then(_ => {

  var views = [];
  sequelize.modelManager.forEachModel(m => {
      if (m.options.doNotSync && m.createView) {
        views.push(m);
      }              
  });

  return Sequelize.Promise.each(views, v => {

    return v.createView(sequelize.models);

  });

});

另外,为了安全起见,我添加了挂钩以防止在视图上使用任何创建/更新/删除操作。

hooks: {
  beforeBulkCreate: throwNotAllowedError,
  beforeBulkDestroy: throwNotAllowedError,
  beforeBulkUpdate: throwNotAllowedError,
  beforeCreate: throwNotAllowedError,
  beforeDestroy: throwNotAllowedError,
  beforeUpdate: throwNotAllowedError
}

throwNotAllowedError是一个简单的函数

function throwNotAllowedError() {
  throw new Error("Operation not allowed on a view");
}

希望有所帮助。获得Sequelize的观点使我们在项目上的生产力大幅增加。

您仍然可以从视图中创建关系和关联,从而允许您使用include:[]表示法将其他表添加到视图查询中。

答案 1 :(得分:2)

您无法通过在主要续集中使用同步来跳过模型,

但您可以使用模型同步功能,只在想要同步的模型上调用同步功能

http://docs.sequelizejs.com/en/latest/api/model/#sync-promisethis

答案 2 :(得分:1)

我刚刚做了:

const MyView = sequelize.define('myView', {
  ids: {
    type: DataTypes.ARRAY(DataTypes.INTEGER)
  },
  volumeSum: {
    type: DataTypes.INTEGER
  }
});

// To avoid table creation
MyView.sync = () => Promise.resolve();

然后sequelize.sync();没有为视图创建表。 希望对您有帮助...

答案 3 :(得分:0)

好的,正如告诉Keval我需要在模型上同步(),所以我从sequelize.sync()复制/粘贴代码并更改它:

if (config.sync && config.sync != 'false') {
  let models = [];
  sequelize.modelManager.forEachModel(function(model) {
    if (model && model.options.sync !== false) {
      models.push(model);
    } else {
      // DB should throw an SQL error if referencing inexistant table
    }
  });
  return Sequelize.Promise.each(models, function(model) {
    return model.sync(config.sync);
  });
}