prismaのquickstartであるstarterを1から作ってみた
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で困った部分だったので