使用SequelizeJS和PostgreSQL与.bulkCreate()实现时,如何以1:M关系使用外键

时间:2018-06-27 23:40:22

标签: javascript node.js postgresql foreign-keys sequelize.js

我正在编写一个可以从(.csv)数据集中提取数据的脚本。我能够将数据拉入控制台,创建新表并将数据插入数据库。

我想弄清楚在实现.bulkCreate()时如何设置外键。当我坚持使用常规.create()时,会遇到资源错误。

数据集保存在2个数组中:

  • competitorObjs
  • meetObjs

到目前为止,这是我要插入数据的方式:

sequelize.sync().then(() => {

meets.bulkCreate(meetObjs).then(data => {

    competitorObjs.forEach(x => {

        competitors.create({
            MeetID: x.MeetID,
            Name: x.Name,
            Sex: x.Sex,
            Equipment: x.Equipment,
            Age: x.Age,
            Division: x.Division,
            BodyweightKg: x.BodyweightKg,
            WeightClassKg: x.WeightClassKg,
            BestSquatKg: x.BestSquatKg,
            BestBenchKg: x.BestBenchKg,
            BestDeadlift: x.BestDeadlift,
            TotalKg: x.TotalKg,
            Place: x.Place,
            Wilks: x.Wilks,
            UserId: data.get("MeetID")   // Set FK here (Not sure if correct implementation)
        })
    })
}).then(() => {
    console.log("Bulk Creation Success!");
}).catch((err) => {
    console.log(err)});
})

脚本完成后,仅填充“会议”表,而“竞争对手”保持空白。

如何在每个“竞争对手”插入中设置外键以指向“会议”表中的每个主键? (未将FK设置为​​唯一)

2 个答案:

答案 0 :(得分:0)

您快到了。您可以使用index

循环播放
competitorObjs.forEach((x, index) => {
  competitors.create({
...
..
..
  UserId: data[index]["MeetID"]

此方法的问题在于,要创建N个对象,您将创建N + 1个查询。 1用于批量创建,N用于关联表。您也可以在关联的数组中使用bulkCreate

您可以遍历competitorObjs,如上所述填充UserId,然后进行bulkCreate。

答案 1 :(得分:0)

发布解决方案,或者至少发布让我填充竞争对手表格的内容。

出于某种原因,我认为我们在插入过程中设置了外键。

在顶部,我认为我将“竞争者”模型中的FK设置为​​“ MeetID”

   meets.hasMany(competitors, {
        foreignKey: "MeetID",
        constraints: false
    });

    var meetObjs = [];
    var competitorObjs = [];

    //  Extract meets data to meetObjs
    //  confirm connection...
    sequelize.authenticate().then(() => {
        console.log("Data base connection established")
    }).then(() => {

        //  read contents of file...
        fs.readFile(path.join(__dirname, "/data/meets.csv"), "utf-8", (err, data) => {
            if (err) {
                console.log(err);
            } else {

                //  begin parsing data...
                Papa.parse(data, {
                    delimiter: ',',
                    newline: '\n',
                    complete: function (results) {

                        //  push to meetObjs array
                        for (let i = 1; i < results.data.length - 1; i++) {   //NOTE: Last element extracted is NaN. Look more into this.

                            meetObjs.push({
                                MeetID: results.data[i][0],
                                MeetPath: results.data[i][1],
                                Federation: results.data[i][2],
                                Date: results.data[i][3],
                                MeetCountry: results.data[i][4],
                                MeetState: results.data[i][5],
                                MeetTown: results.data[i][6],
                                MeetName: results.data[i][7]
                            })
                        }




                        //  read contents of file...
                        fs.readFile(path.join(__dirname, "/data/openpowerlifting.csv"), "utf-8", (err, data) => {
                            if (err) {
                                console.log(err);
                            } else {

                                //  begin parsing data...
                                Papa.parse(data, {
                                    delimiter: ',',
                                    newline: '\n',
                                    complete: function (results) {

                                        //  push to meetObjs array
                                        for (let i = 1; i < results.data.length - 1; i++) {   //NOTE: Last element extracted is NaN. Look more into this.

                                            competitorObjs.push({
                                                MeetID: Number(results.data[i][0]),
                                                Name: results.data[i][1],
                                                Sex: results.data[i][2],
                                                Equipment: results.data[i][3],
                                                Age: Number(results.data[i][4]),
                                                Division: results.data[i][5],
                                                BodyweightKg: Number(results.data[i][6]),
                                                WeightClassKg: results.data[i][7],
                                                Squat4Kg: Number(results.data[i][8]),
                                                BestSquatKg: Number(results.data[i][9]),
                                                Bench4Kg: Number(results.data[i][10]),
                                                BestBenchKg: Number(results.data[i][11]),
                                                Deadlift4Kg: Number(results.data[i][12]),
                                                BestDeadlift: Number(results.data[i][13]),
                                                TotalKg: Number(results.data[i][14]),
                                                Place: results.data[i][15],
                                                Wilks: Number(results.data[i][16])
                                            })
                                        }

                                        sequelize.sync().then(() => {
                                            meets.bulkCreate(meetObjs).then(() => {
                                                competitors.bulkCreate(competitorObjs).then(() => {
                                                    console.log("Competitors created!");
                                                }).catch("Competitors creation failed!")
                                            }).then(() => {
                                                console.log("Meets created!");
                                            }).catch(() => {
                                                console.log("Meets creation failed!");
                                            })
                                        })
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });


    }).catch(() => {
        console.log("Something went wrong trying to connect to the DB");
    });