0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Nestjs × Docker] prisma ORM で migration するときに躓いた話

Posted at

「それでも、と言い続けろ」
マリーダクルスの言い付けを守り続けています。

  1. 朝起きたけどクソ寒いとき
  2. ベンチプレスで潰れそうなとき
  3. 有酸素運動が憂鬱なとき
  4. エラーが全く直らないとき
  5. エヴァの時短駆け抜けたとき
  6. タバコ、エナジードリンクの誘惑に負けそうなとき

自分に負けそうなときでも、マリーダさんの言い付けを思い出し、自分を奮い立たせています。
そう、僕はユニコーンガンダムのパイロットなのです。

Docker × NestJSでデータベース環境(postgres)を作りたい!

いろいろ省きますが、僕は現在docker上でNestJS環境を構築し、開発を進めています。
僕は普段Laravelを利用しているので、NestJSを使うのはワクワクしています。
また、データベースも普段はMySQLを利用していたので、勉強の意味も兼ねてpostgres環境でやろうと思いました。

セットアップやパッケージのインストール等は省きます。
ちなみにパッケージはprismaを利用しています。
以下の公式ドキュメントを参考にしてください。(マイグレーションのNestJS公式ドキュメント)
https://docs.nestjs.com/recipes/prisma#create-two-database-tables-with-prisma-migrate

NestJS、データベースの環境は以下です。
docker.compose.yml

db:
    image: postgres:latest
    environment:
      POSTGRES_USER: jony_newtype
      POSTGRES_PASSWORD: password
      POSTGRES_DB: app_database
    volumes:
      - postgres_volume:/var/lib/postgresql/data
      - ./docker/postgres/script:/docker-entrypoint-initdb.d
      - ./docker/postgres/postgresql.conf:/etc/postgresql/postgresql.conf
    ports:
      - '5432:5432'
    networks:
      - app-networks

nestjs:
    build:
      context: ./api
      dockerfile: Dockerfile
    volumes:
      - ./api/nest-api:/app
    ports:
      - '3000:3000'
    networks:
      - app-networks

networks:
  app-networks:
    driver: bridge

volumes:
  postgres_volume:

他にもコンテナはありますが、省いています。
まずここで注目してほしいのが同じnetworkに乗せているということです。

バックエンドのコンテナとデータベースのコンテナが同じnetworkに乗っていないと、データベースのホスト名を識別できず、直接通信ができない

次にバックエンド側のマイグレーション関連のファイルです。
主に以下のファイルが重要です。
・schema.prisma
・.env

最初にschema.prisma

generator client {
  	provider = "prisma-client-js"
}

datasource db {
  	provider = "postgresql"
  	url      = env("DATABASE_URL")
}

----これより下にテーブル仕様

次に.env

DATABASE_URL="postgresql://jony_newtype:password@db:5432/app_database?schema=newtype"
DATABASE_USER=jony_newtype
DATABASE_PASSWORD=password
DB_HOST=db

.env側からユーザやパスワードを環境変数に代入する必要があるのは言うまでもありませんが、ここで注目してほしいのはschemaとDB_HOSTという変数です。

僕はこれまでデータベースのschemaという概念を理解できていませんでした。
これはデータベースとテーブルの間にあるレイヤーです。
これを間違っていたため、マイグレーションが許されませんでした。

またDB_HOSTの環境変数についてですが、

これを代入しないと、URL上でコンテナ名であるデータベースホストを識別してくれません。

僕の場合はこの"db"はコンテナのサービス名です。
データベースのエンドポイントを示すために必要な記述ですが、DB_HOSTに代入しないとただのよくわからん文字列と判別されてしまうようです。

終わり

NestJSで開発を進めていますが、結構楽しいです。
僕はNestJSのロゴと色が大好きです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?