정적인 데이터를 삽입해야 되는 때가 가끔씩 존재한다. 이걸로 몇번 데이터가 직접 만들어서 넣은 수고로움을 덜고자 글을 쓰고자 한다. 진작 알았더라면 좋을 것 같다. 역시 지식이 힘이다.
sequelize를 install할 때, Sequelize CLI를 같이 설치 했기 때문에 이 명령어는 따로 작성하지 않아도 된다. 그렇지만 cli를 sequlize를 설치할 때 같이 작성치 않았다면 설치를 해준다.
npm i —save sequelize-cli
seeder파일을 삭제했다고 하더라도 generate할 때 자동으로 파일이 생성되기 때문에 삭제해도 무관하다.
Seeder 개념
seeders는 생성된 각 테이블에 기본으로 필요한 데이터나 예시 데이터를 추가할 때 사용한다. 즉, 정적인 데이터 삽입 기능이다.
Seeder 생성
seeders파일을 생성할 때 아래와 같은 명령어를 입력한다.
sequelize seed:generate --name <파일명>
// ex) sequelize seed:generate --name products
seeders내에 <timestamp>-<파일명>.js 파일이 생성된다.
- up : 해당 seeder 내용을 반영할 때 수행할 로직
- down : 반영된 내용을 취소하여 되돌릴 때 수행할 로직
아래와 같은 코드가 생성이 된다.
// 20220702024950-new_data.js
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
/**
* Add seed commands here.
*
* Example:
* await queryInterface.bulkInsert('People', [{
* name: 'John Doe',
* isBetaMember: false
* }], {});
*/
},
down: async (queryInterface, Sequelize) => {
/**
* Add commands to revert seed here.
*
* Example:
* await queryInterface.bulkDelete('People', null, {});
*/
},
};
나는 데이터베이스에 내가 임의로 작성한 데이터베이스가 존재하고, 여기에 Users이라는 테이블이 존재한다. 그래서 이 테이블 안에 seeder를 생성하고자 한다.
seeder를 작성할 때, 컬럼이나 데이터 타입이 일치하지 않으면 정상적으로 수행되지 않는다. 적용할 테이블의 정보를 확인 후 주의하여 제공된 메뉴얼을 참고하여 작성해야 한다. 테이블에 정보를 잘못 작성했을 경우 터미널에 그에 관련해서 뜨니 이를 참고하여 작성하면 된다.
위와 같이 안 했더니 오류가 발생했다. createdAt과 updatedAt은 sequelize생성할 때 기본적으로 생성되서 데이터를 안 넣어줘도 되겠다 싶어서 안 넣었더니 오류가 났다.
createdAt과 updatedAt을 기본값으로 넣어주었더니 오류가 나지 않았다.
또한, 외래키가 존재하는 경우, 테이블 관계에 맞게 순서대로 Seed진행이 필요하다.
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
async (queryInterface, Sequelize) => {
await queryInterface.bulkInsert(
"Users", // 테이블 명
[
{
id: 1,
email: "test@test.net",
name: "윤종신",
createdAt: new Date(),
updatedAt: new Date(),
},
{
id: 2,
email: "test2@test.com",
name: "유희왕",
createdAt: new Date(),
updatedAt: new Date(),
},
{
id: 3,
email: "test3@test.net",
name: "유유",
createdAt: new Date(),
updatedAt: new Date(),
},
],
{}
),
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete("Users", null, {});
},
};
Seeder 실행
실행
$ sequelize db:seed --seed <파일명> // 단일 실행
// ex) sequelize db:seed --seed 20211026102120-products.js
$ sequelize db:seed:all //seeder파일 안에 모든 파일 실행
되돌리기
sequelize db:seed:undo:all //모든 Seed를 되돌린다.
sequelize db:seed:undo // 가장 최근 Seed를 되돌린다.
sequelize db:seed:undo --seed name-of-seed-as-in-data // 특정 Seed를 되돌린다.
결과물
위의 명령어를 사용하여 실행했을 때 터미널에서 이렇게 출력되고 db에서 출력물이 확인이 가능하다.
실행시 결과물
이렇게 하면 제대로 된 테이블이 생성된다. 되돌리기 명령어를 써서 되돌리기를 하면 Seeders 되돌리기시 기존에 있는 데이터가 삭제되는 부분이 있기 때문에, 이 부분은 인지해야 한다.
오류
1. 테이블명 오류 로직 작성시에는 up과 down을 구분하고 작성해줘야 한다. 근데 up을 실행시켜 테이블이 수행되는 것이어서 up에만 초점을 두었다. 그래서 up의 테이블명은 제대로 써주었는데 오류가 나서 왜 나지 이랬는데 down의 테이블명을 고치지 않아 오류가 발생하였다.
2. 이 경우는 설치가 안되어 있는 줄 알아서 설치를 했는데 계속적으로 오류가 났다. 그래서 구글링했더니 전역 변수로 하여 설치하라는 말이 있어서 그렇게 설치를 했더니 오류가 해결이 되었다.
npm install mysql2 -g
3. 계속적으로 config.json을 인식을 못해서 나는 오류같았다. 구글링해보았을 때 여러가지 설정을 건드려보았는데 이게 아닌 것 같았다. 그래서 다시 오류난 구문을 보았더니 파일의 루트가 잘못 된 것 같아서 올바른 루트로 하여 실행되게 설정하였다.
db/seeders로 하여 실행시켰을 때 config/config.json이 파일 루트로 붙으면서 오류가 나기에 db에서 실행시키네 올바른 루트로 되어 잘 실행되었다.
4. 위의 seed를 생성하는 명령어를 사용하여 seed를 생성했는데, seeders 파일이 두개가 되어버려서 파일이 인식이 되어버렸다. 굳이 처음에 seeders파일이 없어도 생성 안 해도 될 것 같다. 그래서 파일 하나를 지워줬더니 인식이 잘 되었다.
5. sequelize에 대한 용어를 인식을 못하길래 또 구글링했다. VSCode의 기본 터미널이 powershell로 설정되어 있기 때문에 나는 오류였다. VSCode의 기본 터미널의 종류를 바꿔주면 해결 가능하다.
- 터미널 설정방법
- ctrl + Shift + P를 누르면 터미널의 종류가 나온다.
- 거기서 터미널 : 기본 프로필을 선택한다.
- Command Prompt 클릭한다.
- 터미널을 닫았다가 다시 실행한다. (단축키 : ctrl +shift +`)
아래와 같은 사이트를 참고하였습니다.