在批量插入预先存在的数据之后,对hasOne关联的链接模型进行Sequelize返回`null`对象

时间:2017-05-25 05:58:22

标签: sqlite sequelize.js

我有一个JSON文件形式的预先存在的数据,我试图插入到Sequelize SQLite表中。我有2个表:Master_VesselRequests。有一个Request.hasOne(Vessel)关联,这意味着每个request都有一个vessel关联。

连接两个模型的关键是vessel.Vessel_Name,这是一个字符串。数据是从验证密钥的系统生成的,因此它是一致的(request.Vessel_Name中存在vessel.Vessel_Namevessel.Vessel_Name是唯一的)。

我想将这些数据加载到Sequelize托管表中。我正在创建模型如下:

var Request = sequelize.define('request', {
     // other fields
     Vessel_Name: {
        type: Sequelize.STRING
     }
}, {
    tableName: 'Request'
});

var Vessel = sequelize.define('vessel', {
     // other fields
     Vessel_Name: {
        type: Sequelize.STRING,
        primaryKey: true
     }
}, {
    tableName: 'Master_Vessel'
});

并且,协会如下:

Request.hasOne(Vessel, {foreignKey: 'Vessel_Name', allowNull: true});

现在,我按以下步骤加载数据:

  1. 创建并批量加载Vessel模型
  2. 创建Request模型,关联并批量加载Request模型
  3. 一切运行良好,没有任何问题。但是当我尝试使用关联查询时如下:

    Request.findOne()
    .then(request => {
        console.log(request.get())
        request.getVessel()
        .then(vessel => console.log(vessel))
    });
    

    request实例包含Vessel_Name外键,但vessel实例为null

    有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

好的,这是因为我得到了Sequelize'词汇'混淆,Request.hasOne(Vessel)并不意味着Request会有一个Vessel_Name指向Vessel。为了正确的含义,将其读作R-> L,而不是L-> R。

该问题的解决方案是将关联从hasOne更改为belongsTo,如下所示:Request.belongsTo(Vessel),因此现在将在Request上创建FK。

很容易混淆关联名称和语义!