👨‍💻

Prisma入門

2023/10/23に公開

はじめに

Prismaを仕事で使うことになったので、基本的な役割や書き方を整理します。

Prismaとは

PrismaはオープンソースのORM(Object Relational Mapping)サービスです。
ちなみにORMとは、RDBのデータ操作をオブジェクト指向型言語の書き方で行うプログラミング手法です。オブジェクトに定義したメソッドで、SQLを書かずにデータベースの操作ができます。
その中でもPrismaは、Node.js + TypeScript の開発に適したORMだと、公式に記載されています。

公式トップ
" Next-generation Node.js and TypeScript ORM "

Prismaクライアントの説明
" Prisma Client can be used in any Node.js (supported versions) or TypeScript backend application (including serverless applications and microservices). "

初期セットアップ

TypeScriptのプロジェクトで、Prismaをインストールします。

npm install prisma --save-dev

Prisma CLIで初期化コマンドをたたきます。sqliteの部分は利用するデータベースにあわせ変更してください。

npx prisma init --datasource-provider sqlite

これらを行うと、あなたのTypeScriptプロジェクトにprismaディレクトリが作成されます。その中にschema.prismaファイルが作成されます。また、ルートディレクトリ配下に.envファイルも作成されるはずです。
準備は以上です。

モデル定義

先程の初期化コマンドで作成されたschema.prismaにモデル定義をします。
書き方はこんな感じです。

schema.prisma
model "テーブル名" {
  "キー1" "キー1の型" @"Attribute"
  "キー2" "キー2の型" @"Attribute"
  "キー3" "キー3の型" @"Attribute"
  ...
}

Attributeとはキーに対する設定で、必要なければ書く必要はありません。
しかし、各モデルには少なくとも以下のうち1つを設定しなければなりません。

  • @unique ...ユニーク属性
  • @@unique ...複合ユニーク属性
  • @id ...ID
  • @@id ...複合ID

これらの他にもAttributeの種類はあります。

以下はモデル定義の実装例です。

schema.prisma
model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}

マイグレーション

schema.prismaのモデル定義をもとにマイグレーションを行っていきます。
以下のコマンドをたたき、テーブルの作成を行います。

npx prisma migrate dev --name init

このコマンドで2つのことを実行します。

  1. prisma/migrationsディレクトリにmigration.sqlファイルを作成
  2. データベースに対してSQLマイグレーションを実行

migration.sqlには、先程schema.prismaに定義したモデルの通りにSQL文が記述されています。

実際にデータベース内にテーブルが作成されているのか確認するため、Prisma Studioを以下コマンドで立ち上げます。

npx prisma studio

自動でPrisma Studioが立ち上がり、作成したデータベースを選択すると、空のテーブルが作成されていることを確認できます。

おわりに

ORMは、簡単にデータベース操作を行うことができます(複雑な操作には向かないようですが)。
これからたくさん使ってみて、感じたメリデメも追記していけたらと思います。

Discussion