首页 > 解决方案 > 节点、Sequelize、同步模型、混合力:真/假

问题描述

我很困惑(再次)。

在使用 Sequelize 定义数据库(MySQL)表时,我想做一个同步(强制:真),以删除/创建表。到现在为止还挺好。

现在我对我的表感到满意user,并且不想在每次运行时都放弃它,同时我继续定义其他表。

所以,我想在user选项上设置一个标志,sync: {forced: false}

module.exports = (sequelize, DataTypes) => {
  let Schema = sequelize.define(
    "user",
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      BlaBla:{}
    },
    { // options
      sync: {force: false},
      freezeTableName: true,
      timestamps: true
    });
  return Schema;
};

这不起作用。每次运行时都会删除/创建表。

继续定义我的company表。

module.exports = (sequelize, DataTypes) => {
  let Schema = sequelize.define(
    "company",
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      BlaBla:{}
    },
    { // options
      sync: {force: true},
      freezeTableName: true,
      timestamps: false
    });
  return Schema;
};

问题

标签: mysqlnode.jsmodelsequelize.js

解决方案


sequelize.define()不支持有选择地同步。有关详细信息,请参阅模型定义配置。在您的项目的其他地方,您必须调用sequelize.sync({force: true})同步所有模型。您应该首先纠正它,因为它会批量强制所有模型同步。

修复该问题后,您有几个选择:

1:继续使用迁移。对架构的每次添加或更改都会在迁移中捕获,因此您可以推出每个更改而无需重新同步其他更改。请参阅http://docs.sequelizejs.com/manual/migrations.html

2:按照您的建议单独同步每个表。您需要sync()分别为每个模型调用该方法,例如:

const user = require('./user');
const company = require('./company');
company.sync();
compant.sync({force:true});

这对于早期开发可能是实用的,但是随着您在项目中取得进展并开始发布,迁移应该是您推出模式更改的首选方法。

请参阅http://docs.sequelizejs.com/manual/models-definition.html#database-synchronization


推荐阅读