위코드 3주차 과정중, mySQL과 dbmate를 쓰면서 직접 사용했던 쿼리문과 커맨드를 정리하고 그 과정 자체를 이해해보고자 한다.
express로 작성된 api의 초기세팅이 끝나고, MySQL로 crud_express
라는 db를 생성했다.
$ cat .env
DATABASE_URL="mysql://root:0519@127.0.0.1:3306/crud_express"
아래 작성한 내용은 그 이후의 내용으로 dbmate의 마이그레이션으로 테이블을 생성하는 과정이다.
dbamate new urMigrationName
dbmate로 마이그레이션 파일 생성
ex)dbmate new create_books_Table
하면
./db/migrations폴더에 아래 파일 생성
20220830163200_create_books_table.sql
$ tree db
dbmate로 생성된 마이그레이션 파일 root폴더에서 tree 확인
TIP : tree명령어 not found시 brew install tree
로 설치
db
├── migrations
│ ├── 20220830163200_create_books_table.sql
│ ├── 20220830163215_create_authors_table.sql
│ └── 20220830163253_create_books_authors_table.sql
└── schema.sql
(총 3개의 테이블 중 authors테이블은 생략하여 설명)
dbamte new
로 생성된 마이그레이션 파일(20220830163200_create_books_table.sql
)안에 아래 MySQL 쿼리문 입력
-- migrate:up
CREATE TABLE books (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
description VARCHAR(2000) null,
cover_image VARCHAR(1000) null,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT ON UPDATE CURRENT_TIMESTAMP
);
-- migrade:down
DROP TABLE books;
CREATE TABLE books ();
();안의 컬럼들로 books 테이블 생성
MySQL 명령어나 쿼리문 입력후 ';'를 치고 엔터
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
컬럼명 제약조건, 순으로 작성
ID
: id 컬럼 생성
INT
: 정수값으로 생성
NOT NULL
: null 값이 올 수 없게 (데이터를 반드시 입력해야 함)
AUTO_INCREMENT
: id의 int를 자동으로 카운팅
->AUTO_INCREMENT = 4
의 방식으로 초기값을 4로 설정 가능)
PRIMARY KEY
: id를 books_aurhtors의 primary key로 지정
cover_image VARCHAR(1000) null,
VARCHAR(1000)
cover_image에 대한 url을 1000자 이하의 텍스트로 입력
null
빈 값 가능
updated_at TIMESTAMP NOT NULL DEFAULT ON UPDATE CURRENT_TIMESTAMP
updated_at 컬럼에 수정할때의 현재시간 입력
-- migrate:up
CREATE TABLE books_authors (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
book_id INT NOT NULL,
author_id INT NOT NULL,
CONSTRAINT books_authors_book_id_fkey FOREIGN KEY (book_id) REFERENCES books(id),
CONSTRAINT book_authors_author_id_fkey FOREIGN KEY (author_id) REFERENCES authors(id)
);
-- migrade:down
DROP TABLE books_authors;
CONSTRAINT books_authors_book_id_fkey FOREIGN KEY (book_id) REFERENCES books(id),
CONSTRAINT
제약조건 설정books_authros_book_id_fkey FOREIGN KEY(book_id)
'authors_book 테이블'의 'book_id' 를 'foreign key'로 쓸건데REFERENCES books(id),
설정된 fkey는 books테이블의 id를 참조한다.dbmate up
마이그레이션 파일 쿼리문을 작성후 dbmate up
를 입력하면 -- migrate:up
에 해당하는 내용, 즉 테이블이 생성되고 schema.sql
이 생성된다.
Applying: 20220830163200_create_books_table.sql
Applying: 20220830163215_create_authors_table.sql
Applying: 20220830163253_create_books_authors_table.sql
Writing: ./db/schema.sql
+------------------------+
| Tables_in_crud_express |
+------------------------+
| authors |
| books |
| books_authors |
| schema_migrations |
+------------------------+
dbamte down
을 입력하게 되면 DROP TABLE 해당테이블;
이 작동하여 테이블이 삭제된다.
학습 중 만든 api에서 dbmate migration으로 생성된 테이블을 사용한다. 데이터의 CRUD는 typeORM모듈을 활용할 예정이지만 추후 schema.sql
을 확인하여 스키마 구조를 확인하고 데이터를 활용할 수 있다.