【问题标题】:NodeJS and MySQL: Importing CSV data with associationsNodeJS 和 MySQL:导入带有关联的 CSV 数据
【发布时间】:2020-07-31 17:29:04
【问题描述】:

我在网上搜索了this,这可能与我的问题有关,但由于我不明白,所以我来问这个。

我正在尝试将数据插入表中。我正在使用sequelize v6 和mysql。

我的数据库中有什么

我有 2 张桌子,student 和 township。

学生桌:id, name, email, township_id

乡镇表:id, name

我的联想有什么

学生模型

Student.belongsTo(models.Township, {
    foreignKey: "townshipId",
    as: "township",
});

乡镇模式

Township.hasMany(models.Student, {
    foreignKey: "townshipId",
    as: "township",
});

我在 req 中有什么:

在我的请求中,我有如下数据:

{
    name: 'john',
    email: 'john@gmail.com',
    township: 'Flank',
}

问题

实际上,我正在尝试将 csv 数据批量插入到我的数据库中。最终用户将使用上述数据(在req中)将数据填充到excel中并保存为csv文件并将其导入系统。问题是我从解析 csv 得到的值是乡镇名称text value,在本例中为Flank。但我确实需要将其更改为 integer township_id 以便我可以使用该 township_id 插入到 students 表中。

(我所做的:在这种情况下,我获取镇名称Flank 并运行查询SELECT township_id FROM townships WHERE name = 'Flank',如果Flank 存在于 townships 表中,我将返回 township_id。所以,我现在可以使用它township_id 插入到students 表中。但我认为它非常昂贵,另一个事实是我还有另外 50 个这样的字段。)

因此,我的问题是,如何在不首先明确找到 township_id 的情况下将 township: 'Flank' 插入到 students 表中(避免我所做的事情)。

谢谢。

【问题讨论】:

  • 你想在township表中创建一个新乡镇,在student表中创建一个新学生,以及他们的关系吗?
  • 没有。我想插入关联。实际上,我正在通过系统导入 CSV。在 CSV 中,最终用户将从下拉列表中选择乡镇名称。所以我从解析 CSV 中得到的值就像我在问题中的 req 一样。但是当我实际将该数据插入学生表时,我需要映射或关联与 Flank 均衡的 township_id 并插入它。 @slideshowp2
  • 不确定,但也许this thread 可以帮助您。不是在运行时处理数据(在处理和插入时),而是从源头修复问题并修复下拉行为,以便用户选择文本但在工作表中选择 id。
  • @RaghavGarg 谢谢。我是这样想的,但我不确定将这些数据放在 Excel 中是否合适(我的意思是隐藏那些真实的数据列,因为最终用户可能会不小心删除该列或其他任何内容)并且当我搜索时网上,我找到了this question,它在模型内部进行映射。所以,我想知道如何在续集中实现这一点。不过谢谢你的评论。
  • 此方法可能不适用于大型数据集,但您可以使用单个 SQL 查询将乡镇的完整数据加载到内存中,并将其转换为以乡镇名称为键的哈希,以便每个学生记录都只能从内存中获取 O(1) 中的 township_id。

标签: mysql node.js sequelize.js


【解决方案1】:

问题是我从解析 csv 得到的值是乡镇名称作为文本值,在本例中为 Flank。但我确实需要将其更改为整数 township_id,以便我可以使用 township_id 插入到 students 表中。

为此,而不是

INSERT INTO students (name   , township, ...)
    VALUES           ('John' , 'Flank' , ...)

你必须使用

INSERT INTO students (name   , township_id, ...)
    SELECT            'John' , township_id, ...
    FROM towns
    WHERE town_name = 'Flank';

PS。我不知道INSERT .. SELECT 在脚本/框架语法中是如何执行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2021-12-30
    • 1970-01-01
    • 2016-08-06
    • 2013-10-15
    • 2018-01-11
    相关资源
    最近更新 更多