Как использовать внешние ключи в отношении 1: M при реализации с помощью .bulkCreate () с использованием SequelizeJS и PostgreSQL - PullRequest
0 голосов
/ 28 июня 2018

Я пишу скрипт, который может извлекать данные из (.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)});
})

Когда сценарий завершен, заполнена только таблица «Встречи», но «Конкуренты» остаются пустыми.

Как настроить внешние ключи в каждой вставке «Конкурент» так, чтобы они указывали на каждый первичный ключ внутри таблицы «встречается»? (ФК не установлены на уникальные)

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Размещение решения или хотя бы того, что позволило мне заполнить таблицу конкурентов.

Почему-то я думал, что мы установили внешний ключ во время вставки.

Наверху, я думаю, я установил 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");
    });
0 голосов
/ 28 июня 2018

Вы почти у цели. Вы можете зациклить с index

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

Проблема этого подхода заключается в том, что для создания N объектов вы должны создать N + 1 запросов. 1 для массового создания и N для связанной таблицы. Вы также можете использовать bulkCreate в связанном массиве.

Вы можете перебрать competitorObjs, заполнить UserId, как упомянуто выше, а затем выполнить bulkCreate.

...