prismaのquickstartはすぐにできたので、この環境を0から作ってみる
sqliteの説明はないのでDBは適当に選択した
今回はyarnとesbuild-registerでやる
やってみたソース
プロジェクトの作成と必要なもののインストール
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っぽいけど全文検索もサポートしてくれようとしてるところが高印象だった*1。 www.prisma.io
またschemaを元に型をつけてくれるのがとても便利で良い体験だった。次の開発で自分が選んで良いなら実践投入すると思う。
*1:前にtypeormで困った部分だったので