mysql - 能够使用关联进行迁移,但无法使用关联进行查询(未找到关联)
问题描述
我已经建立了一个数据库,其中包含几个相互关联的表: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');
}
};
出价.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"})
};
拍卖.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
查询.js
const findBidOnAuction = () => {Auction.findOne({where:{BidId:2}, include:[{model:Bids}]}).then(data => console.log("result", data))}
如何正确关联这些表?
编辑:同样在 pgAdmin 上,我可以认为这种关系存在,BidId 是拍卖中的外键,链接到 Bids 上的 bid_id
解决方案
我执行以下操作以在迁移中添加外键:
ref
1.我用一个函数为父模型创建一个迁移。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};
推荐阅读
- python - 如何查找一个单词是否在文本文件中并将文件名添加到字典中?
- sql - 为不存在的数据概念化 SQL 查询
- python - 在熊猫数据框中添加随机噪声和随机 NA
- ios - Cordova iOS 6+ 在外部屏幕中自动播放视频
- erlang - 为什么我的程序使用这么多内存运行?
- javafx - 在 3D 空间中丢失 - 来自旋转矩阵(javafx 仿射)的倾斜值(欧拉?)仅部分起作用
- javascript - 将数组存储在 javascript 文件中并在另一个文件中使用它
- java - 将 MySQL 数据存储到 java 对象中的方法
- r - 在 Perudo 中估计概率
- scikit-learn - 如何在数据上找到 70:30 拆分的火车错误?