👻

Web開発を勉強するために、OCRツールを作成する(3)

に公開

レシートOCRツール開発 — Prisma・DB構築編

今回は、Prismaを活用したDB構築を行いました。
変なとこあれば教えてください!

前回のDocker記事はこちら → https://zenn.dev/noayasu/articles/1251bc9fa88daa


Prismaとは

Prismaとは、簡単にいうと TypeScriptでDBを触れるようにするお助けツール のようなものです。

例えば、前回のDockerfile構築で登場した prisma generate というコマンドは、schema.prisma をTypeScriptの型定義に変換したファイルを生成します。また、JavaScriptオブジェクトからSQLに変換してくれる関数群なども生成してくれます。


インストール

今回使用するコマンドは以下の2つです。

npm install @prisma/client @prisma/adapter-pg pg
npx prisma generate

各パッケージの役割

パッケージ 役割
pg Node.jsとPostgreSQLを繋ぐライブラリ
@prisma/client TypeScriptをSQLに変換する処理を入れる箱のようなもの
@prisma/adapter-pg PrismaClientとpgを結合するアダプター

この3つを組み合わせることで、TypeScriptからDBを操作できるようになります。


触るファイルの全体像

今回触るPrisma関連のファイルは以下の3つです。

ファイル 役割
prisma.ts DBとの接続を確立し、TypeScriptからDBを操作できるようにする
schema.prisma DBのテーブル・スキーマを定義する
prisma.config.ts テスト用DBの設定を入れる

prisma.ts

DBとの接続を確立し、TypeScriptからPostgreSQLを操作できるようにするファイルです。

import { Pool } from 'pg';
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '@prisma/client';

// Node.jsのグローバル空間にPrismaの型を定義
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };

// DBのURLを使ってコネクションプールを作成
const pool = new Pool({ connectionString: process.env.DATABASE_URL });

// Prisma用のアダプターに変換
const adapter = new PrismaPg(pool);

// グローバル空間にすでにprismaが存在すればそれを使い、無ければ新しく生成する
export const prisma =
  globalForPrisma.prisma || new PrismaClient({ adapter });

// 本番環境以外(開発中)であれば、生成したインスタンスをグローバル空間に保存しておく
if (process.env.NODE_ENV !== 'production') {
  globalForPrisma.prisma = prisma;
}

schema.prisma

DBのテーブルやスキーマを書くファイルです。
書き方には雛形があり、以下の順で記述します。

  1. generator
  2. datasource
  3. model または enum
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
}

model User {
  id   String @id @default(cuid())
  name String?
}

よく使うアノテーション

アノテーション 役割
@id 主キーとして設定する
@default(cuid()) データ作成時にIDを渡さなかった場合、自動で一意のIDを生成してデフォルト値に入れる

prisma.config.ts

テスト用DBの設定を入れるファイルです。


質問・指摘等あれば、遠慮なく教えてください!

Discussion