TyporM을 사용하여 Express+Docker+MySQL 환경 구축
OS는 Mac을 사용합니다.노드, Yarn 및 Docker가 이미 설치되어 있어야 합니다.처리 도구 등의 버전은 다음과 같습니다.
Node
Yarn
Express
TypeScript
MySQL
16.4.2
1.22.11
4.17.1
4.4.3
5.7.10
환경 구조
프로젝트 폴더를 작성합니다.
❯ mkdir typeorm-sample
❯ cd typeorm-sample
TypeORM을 설치합니다.❯ yarn add typeorm
노드에 TypeScript를 사용하려면 typescript와 ts-node를 설치합니다.❯ yarn add -D typescript ts-node
typerominit 명령을 사용하여 TypeORM 사용에 필요한 파일을 생성합니다.MySQL 및 Express, Docker를 추가합니다.❯ yarn typeorm init --database mysql --express --docker
Project created inside current directory.
파일을 확인한 후 docker-compose.yml이 생성되었습니다.docker-compose.yml의 내용을 보고 mysql5.7의 이미지를 설정했기 때문에 그렇게 사용합니다.❯ ls
README.md ormconfig.json src
docker-compose.yml package-lock.json tsconfig.json
node_modules package.json yarn.lock
부팅
MySQL을 사용하여 Docker를 시작합니다.
❯ docker compose up
docker-compose.yml에 기록된 정보를 확인한 후 MySQL에 연결합니다.❯ docker compose exec mysql /bin/bash
❯ mysql -utest -ptest
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)
접속이 확인되었습니다.이어서 서버를 시작합니다.
❯ yarn
❯ yarn start
yarn run v1.22.11
warning package.json: No license field
$ ts-node src/index.ts
Express server has started on port 3000. Open http://localhost:3000/users to see results
http://localhost:3000/users를 방문하면 다음 JSON이 화면에 표시됩니다.[{"id":1,"firstName":"Timber","lastName":"Saw","age":27},{"id":2,"firstName":"Phantom","lastName":"Assassin","age":24}]
이것은 yarn typeorm init
시 user표와 관련된 데이터를 기본적으로 만들었기 때문입니다.mysql> show columns from user;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| firstName | varchar(255) | NO | | NULL | |
| lastName | varchar(255) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
테이블 작성
그런 다음 TypeORM의 마이그레이션 기능을 사용하여 테이블을 만듭니다.
Enity 생성
Enity를 먼저 정의합니다.Enity는 표 구조를 클래스 문법으로 표현합니다.이번에는 토도 리스트를 소재로 필요한 열을 준비했다.
TODO를 저장하려면 테이블의 정의는 다음과 같습니다.
표 이름:task
열 논리 이름
열 물리적 이름
타입
ID
task_id
integer
타이틀
title
varchar
일자
due_date
date
컨디션
status
tinyint
만든 날짜
created_at
datetime
업데이트 날짜
updated_at
datetime
이를 토대로 Enity를 씁니다.
src/entity/Task.ts
import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
} from 'typeorm';
@Entity()
export class Task {
@PrimaryGeneratedColumn()
readonly task_id: number;
@Column('varchar', { length: 20, nullable: false })
title: string;
@Column('date', { nullable: false })
due_date: Date;
@Column('tinyint', { width: 1, default: 1 })
status: number;
@CreateDateColumn()
readonly created_at?: Date;
@UpdateDateColumn()
readonly updated_at?: Date;
}
Enity 쓰기 방법은 다음을 참조하십시오.마이그레이션 파일 만들기
마이그레이션 파일을 만듭니다.
- n은 파일 이름을 지정하는 필수 매개 변수입니다.
❯ yarn ts-node node_modules/.bin/typeorm migration:generate -n Task
실행 후 src/migration/1635378767371-Task.ts
와 같이 파일을 생성합니다.1635378767371의 부분은 시간 스탬프입니다.src/migration/1635378767371-Task.ts
import {MigrationInterface, QueryRunner} from "typeorm";
export class Task1635378767371 implements MigrationInterface {
name = 'Task1635378767371'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE \`task\` (\`task_id\` int NOT NULL AUTO_INCREMENT, \`title\` varchar(20) NOT NULL, \`due_date\` date NOT NULL, \`status\` tinyint(1) NOT NULL DEFAULT '1', \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`task_id\`)) ENGINE=InnoDB`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE \`task\``);
}
}
마이그레이션 수행
❯ yarn ts-node node_modules/.bin/typeorm migration:run
반영된 마이그레이션을 확인합니다.❯ yarn ts-node node_modules/.bin/typeorm migration:show
[X] Task1635378767371
✨ Done in 1.53s.
이전 마이그레이션을 스크롤하려면 다음 명령을 실행합니다.❯ yarn ts-node node_modules/.bin/typeorm migration:revert
혹시 모르니까 MySQL에 연결해서task표 열 일람을 확인하고 문제 없이 만들었어요.mysql> show columns from task\G
*************************** 1. row ***************************
Field: task_id
Type: int(11)
Null: NO
Key: PRI
Default: NULL
Extra: auto_increment
*************************** 2. row ***************************
Field: title
Type: varchar(20)
Null: NO
Key:
Default: NULL
Extra:
*************************** 3. row ***************************
Field: due_date
Type: date
Null: NO
Key:
Default: NULL
Extra:
*************************** 4. row ***************************
Field: status
Type: tinyint(1)
Null: NO
Key:
Default: 1
Extra:
*************************** 5. row ***************************
Field: created_at
Type: datetime(6)
Null: NO
Key:
Default: CURRENT_TIMESTAMP(6)
Extra:
*************************** 6. row ***************************
Field: updated_at
Type: datetime(6)
Null: NO
Key:
Default: CURRENT_TIMESTAMP(6)
Extra: on update CURRENT_TIMESTAMP(6)
6 rows in set (0.00 sec)
이상.참고 자료
Reference
이 문제에 관하여(TyporM을 사용하여 Express+Docker+MySQL 환경 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/chida/articles/da18c81674d1a9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)