首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在后续迁移中创建关联

在后续迁移中创建关联
EN

Stack Overflow用户
提问于 2018-11-13 19:47:09
回答 1查看 3.5K关注 0票数 5

Nodejs.4.41.试着通过另一张表制作两种与多对多相关的模型.带着后遗症跑-比如.

代码语言:javascript
复制
sequelize model:generate --name Camera --attributes name:string,sn:string

这是模型

代码语言:javascript
复制
// Camera model

'use strict';

module.exports = (sequelize, DataTypes) => {
  const Сamera = sequelize.define('Сamera', {
    name: DataTypes.STRING,
    sn: DataTypes.STRING
  }, {});
  Сamera.associate = function(models) {
    // associations can be defined here
      Camera.belongsToMany(models.Relay, {through: 'CameraRelay'});
  };
  return Сamera;
};

代码语言:javascript
复制
// Relay model

'use strict';

module.exports = (sequelize, DataTypes) => {
  const Relay = sequelize.define('Relay', {
    name: DataTypes.STRING,
    sn: DataTypes.STRING,
    channel: DataTypes.INTEGER
  }, {});
  Relay.associate = function(models) {
    // associations can be defined here
      Relay.belongsToMany(models.Camera, {through: 'CameraRelay'});
  };
  return Relay;
};

在文档中有几个短语

属于多个关联用于将源与多个目标连接起来。此外,目标还可以连接到多个源。 Project.belongsToMany(User, {through: 'UserProject'}); User.belongsToMany(Project, {through: 'UserProject'}); 这将使创建一个名为UserProject的新模型,该模型具有等效的外键projectId和userId。

迁徙是

代码语言:javascript
复制
// create-relay

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Relays', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      sn: {
        type: Sequelize.STRING
      },
      channel: {
        type: Sequelize.INTEGER
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Relays');
  }
};

代码语言:javascript
复制
//create camera
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Сameras', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      sn: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Сameras');
  }
};

为什么在我运行迁移时,它不创建模型CameraRelay,而不为同一个模型创建迁移?

EN

回答 1

Stack Overflow用户

发布于 2019-05-29 16:53:12

我想误解是关于同步迁移:您所指文档的很大一部分是使用同步方法创建从模型开始的所有表和关联。

当您使用迁移时,您将使用迁移文件创建db所有的表/列/关联(在我的hopinion中,这是一种更好的用于生产的方法)。

要理解不同之处,只需查看相机模型与相机迁移文件:

  • 模型只定义了namesn属性。
  • 迁移文件当然有namesn,但也有idcreatedAtupdatedAt

迁移是文件,目的是以一种安全的方式更改数据库,允许您回滚到过去的任何点。

所以,回到你的问题上,你必须:

  • 创建一个新的迁移文件以创建新的CameraRelay表,其中包含相机表和中继表的外键
  • 使用与CameraRelay表的一对多关系更新当前的相机迁移文件
  • 使用与CameraRelay表的一对多关系更新当前的中继迁移文件

CameraRelay迁移示例:

代码语言:javascript
复制
    'use strict';
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('CameraRelays', {
          cameraId: {
            primaryKey: true,
            type: Sequelize.INTEGER,
            allowNull: false,
            references: {        
              model: 'Relay',
              key: 'id'
            }
          },
          relayId: {
            primaryKey: true,
            type: Sequelize.INTEGER,
            allowNull: false,
            references: {         
              model: 'Camera',
              key: 'id'
            }
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        });
      },
      down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('CameraRelays');
      }
    };
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53288452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档