👻
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のテーブルやスキーマを書くファイルです。
書き方には雛形があり、以下の順で記述します。
generatordatasource-
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