使用Sequelize夹具导入嵌套关联数据

时间:2016-09-01 17:33:17

标签: mysql node.js sequelize.js

我正在尝试使用Sequelize Fixtures为标准化地址数据编写导入脚本,并进行以下设置:

const Address = sequelize.define('address', { ... });
const Cities = sequelize.define('cities', { ... });
const Regions = sequelize.define('regions', { ... });

Address.belongsTo(Cities, {
    foreignKey: 'cityId'
});

Cities.belongsTo(Regions, {
    foreignKey: 'regionId'
});

以下是我要导入的数据示例:

区域导入数据:

╔═════════════╗
║ ID  Region  ║
╠═════════════╣
║ 1   England ║
╚═════════════╝

城市导入数据:

╔════════════╗
║ ID   City  ║
╠════════════╣
║ 1   London ║
╚════════════╝

地址导入数据:

╔═════════════════════════════════════════════════════════╗
║ ID  Owner           Address             City    Region  ║
╠═════════════════════════════════════════════════════════╣
║ 1   Sherlock Holmes 221B Baker Street   London  England ║
╚═════════════════════════════════════════════════════════╝

首先,我导入区域数据,然后导入城市数据并引用该区域:

// regions.json
[
    {
        "model": "Regions",
        "data": {
            "label": "England"
        }
    }
]

// cities.json
[
    {
        "model": "Cities",
        "data": {
            "label": "London",
            "region": {
                "label": "England"
            }
        }
    }
]

这很有效,但是有一种方法可以在引用两者城市区域数据时导入地址数据,以防止Holmes居住在伦敦ON, CA?我已经尝试在城市内嵌套区域数据:

// address.json
[
    {
        "model": "Address",
        "data": {
            "street_1": "221B Baker Street",
            "city": {
                "label": "London",
                "region": {
                    "label": "England"
                }
            }
        }
    }
]

更新#1

我试图变得聪明并使用Sequelize.literal无效:

[
    {
        "model": "Address",
        "data": {
            "street_1": "221B Baker Street",
            "cityId": {
                "val": "SELECT c.id FROM cities c LEFT JOIN regions r ON c.regionId = r.id WHERE c.label = \"London\" AND r.label = \"England\""
            }
        }
    }
]

1 个答案:

答案 0 :(得分:0)

此后,我已经离开了这个项目(已经2年了!),但是我提交的Github issue的最新更新使我想起了我从未见过的来自项目所有者的回复。因此,为了解决这个问题并为以后可能会遇到此问题的任何人提供帮助,请访问the answer

  

以前没有遇到过。我认为目前唯一可行的解​​决方案是为城市指定ID,并使用这些ID

我尚未验证该解决方案,因为就像我说的那样,它是很久以前的,并且不记得我正在从事的项目,但是请告诉我它是否对您有用!