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

Cru*_*der 1 mysql database node.js sequelize.js

我在数据库(mysql)中使用表和视图,因此对于开发/测试环境,我想使用sync(),但是在视图上崩溃。

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

Gar*_*son 6

当我想使用Sequelize创建和使用Views时,我使用的方法与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 ...;");
    }
});
Run Code Online (Sandbox Code Playgroud)

现在,我有了该设置,我需要确保在创建数据库时不包含视图,并且需要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);

  });

});
Run Code Online (Sandbox Code Playgroud)

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

hooks: {
  beforeBulkCreate: throwNotAllowedError,
  beforeBulkDestroy: throwNotAllowedError,
  beforeBulkUpdate: throwNotAllowedError,
  beforeCreate: throwNotAllowedError,
  beforeDestroy: throwNotAllowedError,
  beforeUpdate: throwNotAllowedError
}
Run Code Online (Sandbox Code Playgroud)

throwNotAllowedError一个简单的函数在哪里

function throwNotAllowedError() {
  throw new Error("Operation not allowed on a view");
}
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助。深入了解Sequelize,使我们在该项目上的生产力大大降低。

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


oli*_*uyp 6

我已经做了 :

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

// To avoid table creation
MyView.sync = () => Promise.resolve();
Run Code Online (Sandbox Code Playgroud)

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