DBmate, MySQL

Kyoungchan Cho·2022년 8월 31일
0
post-thumbnail

Intro

위코드 3주차 과정중, mySQL과 dbmate를 쓰면서 직접 사용했던 쿼리문과 커맨드를 정리하고 그 과정 자체를 이해해보고자 한다.
express로 작성된 api의 초기세팅이 끝나고, MySQL로 crud_express라는 db를 생성했다.

$ cat .env
DATABASE_URL="mysql://root:0519@127.0.0.1:3306/crud_express"

아래 작성한 내용은 그 이후의 내용으로 dbmate의 마이그레이션으로 테이블을 생성하는 과정이다.

dbmate 툴을 이용한 MySQL Migrations

1. 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

2. dbmate 마이그레이션에 MySQL 쿼리문 입력

(총 3개의 테이블 중 authors테이블은 생략하여 설명)

ex1) books 테이블

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 컬럼에 수정할때의 현재시간 입력

ex 2) books 테이블과 authors 테이블의 다대다 관계, 중복된 데이터 테이블 생성

-- 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를 참조한다.

3. dbmate up / down

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 해당테이블;이 작동하여 테이블이 삭제된다.

4. 이후 단계

학습 중 만든 api에서 dbmate migration으로 생성된 테이블을 사용한다. 데이터의 CRUD는 typeORM모듈을 활용할 예정이지만 추후 schema.sql을 확인하여 스키마 구조를 확인하고 데이터를 활용할 수 있다.

profile
https://lying-lettuce-69f.notion.site/KyoungchanCho-Blog-f9f150b9e3be4467a67cf2a21932650d (게시글 자동 비공개 현상으로 일단 노션으로 이동합니다. 소개에서 URL 링크 클릭으로 연결됩니다.)

0개의 댓글