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

我在我的DB(mysql)中使用表和视图,所以对于开发/testing环境,我想使用sync(),但它在视图上崩溃。

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

当我想用Sequelize创build和使用视图时,我使用的方法与十字军的答案非常相似。 在这种情况下,我不想让Sequelize尝试同步视图,因为它会导致创build表。 为此,我将以下内容添加到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 ...;"); } }); 

现在我有了这个设置,我需要确保在创build数据库时不包含视图,并且在每个视图上都调用了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); }); }); 

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

 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的看法已经使我们在项目的生产力上有了大幅度的提高。

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

您不能通过在主续集上使用同步来跳过模型,

但是您可以使用模型同步function,并只在需要同步的模型上调用同步function

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

好的,正如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); }); }