Okure U. Edet

Go는Syntax가 Relatively simple인 빠른 프로그래밍 언어입니다. Go를 배울 때 API를 구축하는 방법과 데이터베이스와 통신하는 방법을 배우는 것이 중요합니다. 배울 과정에서 저는 이러한 실습을 위해 프로젝트를 수행하기로 결심했습니다: 간단한 재고 추적 API입니다.

Postgres와 같은 SQL 데이터베이스를 사용할 때, 데이터베이스를Timely manner로 변경하는 것이 중요하다는 것을 배웠습니다. 미래에 수정할 수 있는 Schema가 있다면, 데이터베이스 마이그레이션을 통해 변경하는 것이 가장 좋은 방법입니다. 이를 통해 데이터베이스 변경은 기존 데이터에 영향을 주지 않고 정확하게 이루어집니다.

이篇文章에서는 Docker와 Postgres를 사용한 데이터베이스 마이그레이션에 대해 배울 것입니다.

목차

datABase migration이란 무엇인가?

datABase migration이란 무엇인가고 왜 사용하는 것인가? 결국 backend developer이고 데이터베이스로 데이터를 저장할 수 있는 프로젝트를 작업할 때, 저장하고자 하는 데이터의 스키마를 개발해야 합니다.

Database migrations는 데이터베이스 내에서 데이터 구조를 관리하는 도구이며, 이 경우 관계형 데이터베이스입니다. Migrations는 현재 상태에서 特定/기대 상태로 스키마를 수정하는 것을 도와줍니다. 이로 인해 테이블과 열을 추가하거나, 요소를 제거하거나, 유형과 제약 조건을 변경할 수 있습니다.

database migration의 중요한 이점은 데이터 잃어버리는 걱정없이 데이터베이스에 변경사항을 반복적으로 하나의 연속적인 과정을 만들 수 있다는 것입니다.

final data schema를 어떻게 될지 모르는 경우 migrations를 사용하는 것이 좋습니다. 이러한 의미에서, gradually로 변경을 구현할 수 있습니다.

How to Start and Run a Docker Container

terminal을 오픈하고 mkdir tracking-inventory-app를 입력하여 새로운 디렉터리를 만듭니다.

그 다음 Docker Hub에서 postgres 이미지를 가져와요. 저는 postgres:14-alpine 태그를 사용했지만 사용하고자 하는 태그를 freely사용할 수 있어요.

terminal에 다음을 붙여넣고 enter를 눌러주세요:

$ docker pull postgres:14-alpine

설치 후, docker run 명령을 사용하여 컨테이너를 시작합니다:

$ docker run --name postgres14 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=passwordd -p 5432:5432 -d postgres:14-alpine

--name 플래그는 컨테이너의 이름을 가리킵니다. -e 플래그는 환경 변수를 가리킵니다. -p 플래그는 공개하는 의미입니다. 지정된 포트에서 컨테이너를 실행해야 합니다. -d 플래그는 분리 모드로 실행하려는 것을 의미합니다.

엔터를 누른 후, Docker Desktop이 설치되어 있다면 열어 주십시오. 없으면 docker 웹사이트에서 다운로드할 수 있습니다.

Docker Desktop에서 컨테이너가 시작되었음을 확인할 수 있어야 합니다:

TablePlus를 사용하여 데이터베이스에 연결을 설정할 수 있습니다:

연결을 테스트하십시오. ok라고 표시되면 연결하십시오. Windows에서 인증 에러가 표시되면 시작 버튼을 클릭하고 Run을 클릭합니다. 팝업에서 services.msc를 입력하고 enter를 누릅니다. postgres를 찾고 서비스를 중지하십시오. 그런 다음 다시 연결을 시도하십시오.

TablePlus를 사용하여 스키마를 생성하고 실행하는 방법

tracking-inventory 프로젝트에 대한 사전 정의된 스키마/모델을 db 다이어그램으로 생성했습니다. 이 tracking-inventory는 항목, 시리얼 넘버, 및 값 추가가 가능해야 합니다. 따라서 스키마에는 item, serial_number, id, created_at 필드가 있습니다.

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

제 스키마는 다음과 같습니다. TablePlus를 열고 생성된 PostgreSQL 코드를 추가하고 실행하십시오.

어떻게 golang-migrate를 설치하나요

다음 단계는 golang-migrate를 시스템에 설치하는 것입니다. 이 튜토리얼에서는 Windows의 Linux를 사용합니다.

설치하려면, 이 문서를 방문하세요.

Linux를 사용하므로 curl를 사용할 것입니다:

$ curl -L https://github.com/golang-migrate/migrate/releases/download/v4.12.2/migrate.linux-amd64.tar.gz | tar xvz

성공적으로 설치되었으면, 터미널에서 migrate -help 명령을 실행하여 다양한 명령을 확인할 수 있습니다.

새 마이그레이션을 어떻게 만드나요

golang-migrate를 설치한 후, 새 마이그레이션 스크립트를 만들 수 있습니다.

우선 터미널에서 tracking-app 디렉터리로 이동한 후, code 명령으로 VS code를 엽니다.

그 다음, db라는 새 폴더를 만들고 그 안에 migrations라는 폴더를 만듭니다.

그런 다음 터미널에서 다음 명령을 실행합니다:

 $ migrate create -ext sql -dir db/migration -seq tracking_inventory_schema

-ext 플래그는 마이그레이션을 생성할 때 사용할 확장자를 나타냅니다. 이 경우는 sql입니다. -dir 플래그는 파일을 생성할 디렉토리를 나타냅니다. -seq 플래그는 마이그레이션 파일의 일련번호를 나타냅니다.

VS code 내부에는 updown 파일이 각각 있어야 합니다. 앞者是 디렉터리에 변경 사항을 적용하는 데 사용되는 것이고, 후者는 변경 사항을 되돌리는 데 사용됩니다.

up 파일에는 스키마를 붙여넣을 것입니다.

내 스키마는 이렇게 보입니다:

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

여러분의 스키마는 어떤 项目을 구성하고 있는지에 따라 다릅니다.

`down` 파일에는 다음을 붙여넣으시면 됩니다:

DROP TABLE IF EXISTS inventory;
DROP TABLE IF EXISTS user;

재고 테이블을 먼저 제거하는 것이 좋습니다. 왜냐하면 사용자 테이블을 참조하기 때문입니다.

Docker Postgres 컨테이너 안과 外에서 数据库 생성과 제거하는 方法

docker container가 실행 중인지 확인하실 수 있는 명령어를 사용하세요:

$ docker ps

만약 아니라면, 컨테이너를 시작하는 명령어 `docker start ${container name}`를 사용하여 시작하십시오.

다음 단계는 리눅스에서 Postgres shell에 접근하기 위한 명령어를 사용하는 것입니다:

$ docker exec -it postgres14 bin/bash

-it 옵션은 Interactive shell/terminal을 의미합니다. 이 옵션의 안에서 `createdb` 명령어를 실행할 수 있습니다:

/# createdb --username=root --owner=root tracking_inventory

생성한 후, `psql` 명령어를 사용하여 数据库에 대한 인터랙션을 할 수 있습니다:

/# psql tracking-inventory
psql (14.12)
Type "help" for help.

tracking_inventory=#

또한 `dropdb` 명령어를 사용하여 数据库를 지울 수 있습니다.

shell을 떠나는 것은 `exit` 명령어를 사용하는 것입니다.

Postgres 컨테이너 外에서 数据库를 생성하는 것은 다음과 같은 명령어를 붙여넣으십시오:

$ docker exec -it postgres14 createdb --username=root --owner=root tracking_inventory

TablePlus에서 数据库 보기

생성한 数据库에 대한 보기는 이전에 설정한 연결을 사용하여 연결하십시오. 이를 통해 根数据库로 가서 상단에 있는 db 아이콘을 클릭하십시오.

생성한 数据库이 나타납니다. 그 다음 `open`를 클릭하여 여러분에게 열기를 해주세요.

Migrations을 실행하는 方法

Migrations을 실행하기 위해서는, terminal에서 이 명령어를 실행하세요:

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up

-path 플래그는 마이그레이션 파일이 포함되어 있는 경로를 지정합니다. -database 옵션은 데이터베이스에 대한 URL을 지정합니다.

URL 내에서 드라이버는 postgresql입니다. 사용자 이름과 패스워드는 각각 rootpasswordd입니다. Postgres는 기본적으로 SSL을 사용하지 않으므로 sslmode=disable 옵션을 추가하는 것도 중요합니다.

이제 마이그레이션을 실행합니다:

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up
calhost:5432/tracking_inventory?sslmode=disable" -verbose up
2024/06/25 00:13:25 Start buffering 1/u tracking_inventory_schema
2024/06/25 00:13:25 Read and execute 1/u tracking_inventory_schema
2024/06/25 00:13:26 Finished 1/u tracking_inventory_schema (read 43.186044ms, ran 255.501635ms)
2024/06/25 00:13:26 Finished after 312.928488ms
2024/06/25 00:13:26 Closing source and database

마이그레이션이 성공적으로 완료되었습니다!

데이터베이스를 새로고침하고 새로운 테이블을 확인합니다:

## 결론

이 튜토리얼을 통해 Docker와 Postgres를 사용하여 Go에서 데이터베이스 마이그레이션을 수월하게 작성하고 실행하는 방법을 배웠습니다. 이 글에서 많은 것을 배워보았기를 바랍니다.

트위터링크드인으로 저와 연결할 수 있습니다.