ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

prismaのquickstartであるstarterを1から作ってみた

prismaのquickstartはすぐにできたので、この環境を0から作ってみる

sqliteの説明はないのでDBは適当に選択した

www.prisma.io

今回はyarnとesbuild-registerでやる

やってみたソース

github.com

プロジェクトの作成と必要なもののインストール

yarn init -y
yarn add -D prisma typescript ts-node @types/node
yarn tsc --init
yarn run prisma init

prismの設定等を書いていく

.env

デフォルトだとpostgresqlの接続情報が書かれているので変更する

DATABASE_URL="file:./dev.db"

schema.prism

schema.prismを書き換えていく。デフォルトだとpostgresqlの設定が書いてあるのでそれをsqliteのものに差し替える

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

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

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

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

マイグレーションを作成・実行

yarn run prisma migrate dev --name init

上記のコマンド一発でマイグレーション用のsql作成と実行をしてくれる。 また実行時にprisma-client-jsがインストールされているかをチェックし、存在しなければインストールを行う。

scripts.tsを作成

最終的にはstarterのsqliteファイルをコピーしてくればいいと思うが、一旦createをprism上からやってみる

import { PrismaClient, Prisma } from "@prisma/client"

const prisma = new PrismaClient()

async function main() {
  const user: Prisma.UserCreateInput = {
    email: "sarah@prisma.io",
    name: "Sarah",
  }

  const createUser = await prisma.user.create({ data: user })

  const post: Prisma.PostCreateInput = {
    title: "Hello World",
    published: false,
    author: {
      connect: {
        id: createUser.id
      }
    },
  }
  await prisma.post.create({
    data: post,
  })
}

main()
  .catch((e) => {
    throw e
  })
  .finally(async () => {
    await prisma.$disconnect()
  })

書いたコードを実行する

node -r esbuild-register scripts.ts

これでsqliteにデータが入ったのでコマンドライン上から確認してみる

sqlite3 ./prisma/dev.db

雑なSQLでデータを確認する

# ヘッダーを出るように
.headers ON

select * from User;
select * from Post;

データが入ることが確認できたのでstarterのsqliteファイルでdev.dbを上書きする

quickstartと同じリードの処理を書いて実行してみる

import { PrismaClient, Prisma } from "@prisma/client"

const prisma = new PrismaClient()

async function main() {
  const allUsers = await prisma.user.findMany({
    include: { posts: true },
  })

  // use `console.dir` to print nested objects
  console.dir(allUsers, { depth: null })
}

main()
  .catch((e) => {
    throw e
  })
  .finally(async () => {
    await prisma.$disconnect()
  })

データが無事に取れた!!

まとめ

prisma触ってみよう触ってみようとずっと思っててやっと触れた。

schemaを変更するとmigrationが生成されたり、まだpreviewっぽいけど全文検索もサポートしてくれようとしてるところが高印象だった*1www.prisma.io

またschemaを元に型をつけてくれるのがとても便利で良い体験だった。次の開発で自分が選んで良いなら実践投入すると思う。

*1:前にtypeormで困った部分だったので