【问题标题】:Able to make migration with associations but not able to query with associations (association not found)能够使用关联进行迁移,但无法使用关联进行查询(未找到关联)
【发布时间】:2019-03-29 20:05:18
【问题描述】:

我建立了一个数据库,其中包含几个相互关联的表:Auction 和 Bids。每个拍卖应该有多个投标,每个投标应该只有一个拍卖。我进行了迁移以添加foreignKeys,但是当我尝试在拍卖中查找某个出价时,我收到SequelizeEagerLoadingError: Bids is not associated to Auctions! 错误。

迁移文件:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.addColumn(
      'Auctions', // name of target model
      'BidId',
      {
        type: Sequelize.INTEGER,
        references:{
          model: "bids",
          key: "bid_id",
        },
      },
    );
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Auction');
  }
};

bids.js

const Sequelize = require('sequelize');


// const resolver = require('graphql-sequelize');
const sequelize = require('../config/database');
const Auction = require('./Auction');

const tableName = 'bids';
const Bids = sequelize.define('Bids', {
  bid_id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  createdAt: {
   type: Sequelize.DATE,
   // defaultValue: Sequelize.NOW
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  amount: {
    type: Sequelize.INTEGER
  },
  bid_amount: {
    type:Sequelize.STRING
  },
  bid_no: {
    type: Sequelize.UUID,
    defaultValue: Sequelize.UUIDV4,
  },
}, 
{tableName})

Bids.associate = () => {
  Bids.hasOne(Auction, {foreignKey:"BidId"})
};

auction.js

const Sequelize = require('sequelize');
const sequelize = require('../config/database');
const tableName = 'Auctions';
const Auction = sequelize.define('Auctions', {
  auc_id: {
    type: Sequelize.UUID,
    defaultValue: Sequelize.UUIDV4, // generate the UUID automatically
    primaryKey: true,
  },
  features: {
    type: Sequelize.JSONB,
  },
  bid_amount: {
    type:Sequelize.STRING
  },
  BidId: {
    type: Sequelize.UUID,
  }
}, { tableName });

Auction.hasMany(Bids, {foreignKey: 'BidId'}) 

module.exports = Auction

query.js

const findBidOnAuction = () => {Auction.findOne({where:{BidId:2}, include:[{model:Bids}]}).then(data => console.log("result", data))}

如何正确关联这些表?

编辑:同样在 pgAdmin 上,我可以证明这种关系存在,BidId 是拍卖中的外键,链接到 Bids 上的 bid_id

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    我执行以下操作以在迁移中添加外键:

    1.我使用ref 函数为父模型创建迁移。 const TABLE_NAME = '父';

    function up(queryInterface, Sequelize) {
      return queryInterface.createTable(
        TABLE_NAME, //Bid model
        {
          //attributes
        },
      );
    }
    
    function down(queryInterface, Sequelize) {
      return queryInterface.dropTable(TABLE_NAME);
    }
    
    function ref(Sequelize) {
      return {type: Sequelize.STRING(2), references: {model: TABLE_NAME, key: 'id'}}; // 'id' here is your parent (Bids) primary key
    }
    
    module.exports = {up, down, ref};
    

    2.在要添加引用的子模型上,导入ref函数并像这样添加,因此您的迁移实际上知道您引用的是哪个模型:

    const {ref: REF_Model} = require('name-of-your-migration-file'); //import model
    
    
      async function up(queryInterface, Sequelize){
        await queryInterface.addColumn('Auctions', 'BidId', {...REF_Model(Sequelize), allowNull: true});
      }
    
      async function down(queryInterface){
        await queryInterface.removeColumn('Auctions', 'BidId');
      }
    
    module.exports = {up, down};
    

    【讨论】:

    • 那么您的意思是在迁移过程中您认为模型实际上并没有被引用?在 pgAdmin 中,我可以看到该关联存在。但是 sequelize 不会识别它
    • 我这样做是因为并非总是参考以正确的方式创建它。还要记住在续集(而不是迁移)上更新您的实际模型。这只是在数据库上创建列和 Dr 关联。
    • 好的,我要试试这个,只是一个简单的问题:你到底在哪里参考子模型?通常会有一个 references 参数你可以传递,但我看不到你使用它
    • 在您的子迁移中,即创建列的实际迁移中,有一个父模型REF_MODEL 的导入。因此,如果您检查 ref() 函数,我会返回一个包含所有设置的对象。
    • 不起作用,我在 pgadmin 上没有看到任何 FK 约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多