Sequelize загрузка в исходных данных - PullRequest
0 голосов
/ 18 марта 2020

Мне нужно загрузить данные в БД с помощью Sequelize при первой загрузке приложения. Исходные данные Excel были предоставлены в следующем формате:

Поля группы автомобилей : title | код_группы

Данные группы автомобилей : ('Mercedes', 'M'), ('Volkswagen', 'VW');

Поля автомобилей : код автомобиля | владелец | group_code

Данные автомобиля : ('11 -1135 ',' Fred ',' M '), ('11 -1146', 'Bob', 'VW');

-

В идеале в БД я хочу добавить следующее:

Поля группы автомобилей: group_id | название | group_code

Данные группы автомобилей: (1, «Mercedes», «M»), (2, «Volkswagen», «VW»);

Поля автомобилей: car_id | код автомобиля | владелец | group_id (относится к идентификатору группы, созданному выше)

Данные автомобиля: (1, '11 -1135 ',' Fred ', 1), (2, '11 -1146', 'Bob', 2) ;

-

Как лучше всего это сделать в Sequelize? В SQL я сделал следующее, чтобы обойти эту проблему:

1 - преобразовал мой файл Excel в набор SQL операторов

2 - создал следующий скрипт, используя эти операторы ( а затем я добавил свой собственный код для заполнения group_id):

CREATE TABLE CarGroup(
    group_id INT NOT NULL AUTO_INCREMENT,
    title    VARCHAR(100) NOT NULL,
    group_code   VARCHAR(5) NOT NULL,

    PRIMARY KEY (`group_id`),
    CONSTRAINT UN_car_group_code UNIQUE (group_code)
) ENGINE=InnoDB;
INSERT INTO CarGroup(title,group_code) VALUES ('Mercedes','M');
INSERT INTO CarGroup(title,group_code) VALUES ('Volkswagen','VW');

CREATE TABLE IF NOT EXISTS Car(
  car_id INT NOT NULL AUTO_INCREMENT,
  car_code VARCHAR(10),
  owner VARCHAR(100) NOT NULL,
  group_id SMALLINT, -- populated after insert 
  group_code VARCHAR(10) NOT NULL, -- deleted after insert

  PRIMARY KEY (id),
  CONSTRAINT `UN_car_code` UNIQUE (`car_code`),
  CONSTRAINT `FK_car_group_id` FOREIGN KEY (`group_id`) REFERENCES `CarGroup` (`group_id`)
) ENGINE=InnoDB;

INSERT INTO Car(car_code,owner,group_code) VALUES ('11-1135','Fred','M');
INSERT INTO Car(car_code,owner,group_code) VALUES ('11-1146','Bob','VW');

-- GENERATE GROUP ID'S BASED ON GROUP CODE AND DROP GROUP CODE COLUMN --
update Car INNER JOIN CarGroup ON Car.group_code = CarGroup.group_code
    SET Car.group_id = CarGroup.group_id;
alter table Car drop column group_code

Я не могу понять, как можно достичь вышеуказанного с помощью миграции и заполнения, так как мне нужно создать модель, затем выполнить заполнение и затем запустите изменение. В этом случае проще просто запустить простые операторы SQL в Sequelize? Или я должен просто использовать данные как они есть и связать две таблицы как внешний ключ через group_code (который является строкой - не лучшая производительность по сравнению с простым INT ID).

Любое направление на это высоко ценится!

1 Ответ

0 голосов
/ 22 марта 2020

Не уверен, что это лучший подход, но так как никто не ответил, но я решил сделать следующее:

  • Создать две таблицы, OriginalCars и Cars. OriginalCars имеет исходные поля, которые есть в файле excel (например, car_code). В таблице Cars есть поле car_id и другие поля.
  • Создание моделей
  • Syn c моделей
  • Проверьте вручную, есть ли какие-либо данные в таблицах, если нет затем заполните таблицу originalCars данными. Затем я выполняю внутреннее соединение OriginalCars с таблицей групп, полученные данные анализируются и добавляются в таблицу Car с помощью car_id.
  • Удалите исходную таблицу, поскольку она больше не нужна

Чувствует себя немного взломанным, но он должен делать это только при начальной загрузке приложения, чтобы заполнить начальные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...