メインコンテンツへスキップ

SQLiteでクイックスタート

このクイックスタートガイドでは、プレーンなTypeScriptプロジェクトとローカルのSQLiteデータベースファイルを使用して、Prisma ORMをゼロから始める方法を学びます。データモデリングマイグレーション、データベースのクエリについて説明します。

独自のPostgreSQL、MySQL、MongoDB、またはその他のサポートされているデータベースでPrisma ORMを使用したい場合は、代わりにこちらをご覧ください

前提条件

マシンにNode.jsがインストールされている必要があります(公式サポートされているバージョンについてはシステム要件を参照)。

1. TypeScriptプロジェクトの作成とPrisma ORMのセットアップ

まず、プロジェクトディレクトリを作成し、そこへ移動します。

mkdir hello-prisma
cd hello-prisma

次に、npmを使用してTypeScriptプロジェクトを初期化します。

npm init -y
npm install typescript tsx @types/node --save-dev

これにより、TypeScriptアプリの初期設定を含む`package.json`が作成されます。

情報

別のパッケージマネージャーを使用してPrismaをインストールする方法については、インストール手順を参照してください。

次に、TypeScriptを初期化します。

npx tsc --init

その後、Prisma CLIをプロジェクトの開発依存関係としてインストールします。

npm install prisma --save-dev

最後に、Prisma CLIの`init`コマンドでPrisma ORMをセットアップします。

npx prisma init --datasource-provider sqlite --output ../generated/prisma

これにより、`schema.prisma`ファイルを持つ新しい`prisma`ディレクトリが作成され、SQLiteがデータベースとして設定されます。これで、データをモデリングし、いくつかのテーブルを持つデータベースを作成する準備ができました。

2. Prismaスキーマでデータをモデリングする

Prismaスキーマは、データをモデリングする直感的な方法を提供します。以下のモデルを`schema.prisma`ファイルに追加してください。

prisma/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
}

Prismaスキーマ内のモデルには、主に2つの目的があります。

  • 基になるデータベースのテーブルを表す
  • 生成されるPrisma Client APIの基盤として機能する

次のセクションでは、Prisma Migrateを使用してこれらのモデルをデータベーステーブルにマッピングします。

3. Prisma Migrateでデータベーステーブルを作成するためのマイグレーションを実行する

この時点ではPrismaスキーマはありますが、まだデータベースはありません。以下のコマンドをターミナルで実行して、SQLiteデータベースと、モデルによって表される`User`および`Post`テーブルを作成します。

npx prisma migrate dev --name init

このコマンドは3つのことを行いました。

  1. `prisma/migrations`ディレクトリにこのマイグレーション用の新しいSQLマイグレーションファイルを作成しました。
  2. データベースに対してSQLマイグレーションファイルを実行しました。
  3. 内部的に`prisma generate`を実行しました(これにより、`@prisma/client`パッケージがインストールされ、モデルに基づいてカスタマイズされたPrisma Client APIが生成されました)。

SQLiteデータベースファイルは以前に存在しなかったため、このコマンドは`.env`ファイル内の環境変数で定義されているように、`prisma`ディレクトリ内に`dev.db`という名前でファイルも作成しました。

おめでとうございます、これでデータベースとテーブルの準備ができました。データを読み書きするためのクエリの送信方法を学びましょう!

4. Prisma Clientでデータベースにクエリを送信する方法を探る

Prisma Clientを使い始めるには、`@prisma/client`パッケージをインストールする必要があります。

npm install @prisma/client

インストールコマンドは、Prismaスキーマを読み込み、モデルに合わせて*カスタマイズ*されたPrisma Clientのバージョンを生成する`prisma generate`を自動的に呼び出します。

データベースにクエリを送信するには、Prisma Clientクエリを実行するためのTypeScriptファイルが必要です。この目的のために`script.ts`という新しいファイルを作成します。

touch script.ts

次に、以下のボイラープレートを貼り付けます。

script.ts
import { PrismaClient } from './generated/prisma'

const prisma = new PrismaClient()

async function main() {
// ... you will write your Prisma Client queries here
}

main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})

このコードには、スクリプトの最後に呼び出される`main`関数が含まれています。また、データベースへのクエリインターフェースを表す`PrismaClient`をインスタンス化します。

4.1. 新しい`User`レコードを作成する

まず、データベースに新しい`User`レコードを作成し、結果のオブジェクトをコンソールにログ出力する小さなクエリから始めましょう。以下のコードを`script.ts`ファイルに追加してください。

script.ts
import { PrismaClient } from './generated/prisma'

const prisma = new PrismaClient()

async function main() {
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
},
})
console.log(user)
}

main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})

コードをコピーする代わりに、エディターで自分で入力して、Prisma Clientが提供するオートコンプリートを体験することができます。CTRL+SPACEキーを押して、積極的にオートコンプリートを呼び出すこともできます。

次に、以下のコマンドでスクリプトを実行します。

npx tsx script.ts
表示CLI結果
{ id: 1, email: 'alice@prisma.io', name: 'Alice' }

お疲れ様でした!Prisma Clientで最初のデータベースレコードを作成しました!🎉

次のセクションでは、データベースからデータを読み込む方法を学びます。

4.2. すべての`User`レコードを取得する

Prisma Clientは、データベースからデータを読み込むための様々なクエリを提供します。このセクションでは、指定されたモデルのデータベース内の*すべて*のレコードを返す`findMany`クエリを使用します。

以前のPrisma Clientクエリを削除し、代わりに新しい`findMany`クエリを追加します。

script.ts
import { PrismaClient } from './generated/prisma'

const prisma = new PrismaClient()

async function main() {
const users = await prisma.user.findMany()
console.log(users)
}

main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})

スクリプトを再度実行します。

npx tsx script.ts
表示CLI結果
[{ id: 1, email: 'alice@prisma.io', name: 'Alice' }]

コンソールで単一の`User`オブジェクトが角括弧で囲まれていることに注目してください。これは、`findMany`が単一のオブジェクトを含む配列を返したためです。

4.3. Prisma Clientでリレーションクエリを探る

Prisma Clientの主な機能の1つは、リレーションを簡単に扱えることです。このセクションでは、ネストされた書き込みクエリで`User`レコードと`Post`レコードを作成する方法を学びます。その後、`include`オプションを使用してデータベースからリレーションを取得する方法を確認します。

まず、スクリプトを調整してネストされたクエリを含めます。

script.ts
import { PrismaClient } from './generated/prisma'

const prisma = new PrismaClient()

async function main() {
const user = await prisma.user.create({
data: {
name: 'Bob',
email: 'bob@prisma.io',
posts: {
create: [
{
title: 'Hello World',
published: true
},
{
title: 'My second post',
content: 'This is still a draft'
}
],
},
},
})
console.log(user)
}

main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})

スクリプトを再度実行してクエリを実行します。

npx tsx script.ts
表示CLI結果
{ id: 2, email: 'bob@prisma.io', name: 'Bob' }

デフォルトでは、Prisma Clientはクエリの結果オブジェクトに*スカラー*フィールドのみを返します。そのため、新しい`User`レコードに新しい`Post`レコードも作成したにもかかわらず、コンソールには`id`、`email`、`name`の3つのスカラーフィールドを持つオブジェクトのみが出力されました。

`User`に属する`Post`レコードも取得するには、`posts`リレーションフィールドを介して`include`オプションを使用できます。

script.ts
import { PrismaClient } from './generated/prisma'

const prisma = new PrismaClient()

async function main() {
const usersWithPosts = await prisma.user.findMany({
include: {
posts: true,
},
})
console.dir(usersWithPosts, { depth: null })
}

main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})

ネストされた読み取りクエリの結果を確認するために、スクリプトを再度実行します。

npx tsx script.ts
表示CLI結果
[
{ id: 1, email: 'alice@prisma.io', name: 'Alice', posts: [] },
{
id: 2,
email: 'bob@prisma.io',
name: 'Bob',
posts: [
{
id: 1,
title: 'Hello World',
content: null,
published: true,
authorId: 2
},
{
id: 2,
title: 'My second post',
content: 'This is still a draft',
published: false,
authorId: 2
}
]
}
]

今回は、2つの`User`オブジェクトが出力されているのがわかります。どちらのオブジェクトも`posts`フィールドを持っており(`"Alice"`の場合は空で、`"Bob"`の場合は2つの`Post`オブジェクトが設定されています)、これは関連付けられた`Post`レコードを表しています。

`usersWithPosts`配列内のオブジェクトも完全に型付けされていることに注目してください。これは、オートコンプリートが利用でき、TypeScriptコンパイラが誤って型を付けてしまうのを防ぐことを意味します。

5. 次のステップ

このクイックスタートガイドでは、プレーンなTypeScriptプロジェクトでPrisma ORMを始める方法を学びました。自由にPrisma Client APIをもう少し自分で探求してみてください。例えば、`findMany`クエリにフィルタリング、ソート、ページネーションオプションを含めたり、`update`や`delete`クエリのような他の操作を探求したりすることができます。

Prisma Studioでデータを探索する

Prisma ORMには、データベース内のデータを表示および編集するための組み込みGUIが付属しています。以下のコマンドを使用して開くことができます。

npx prisma studio

独自のデータベースでPrisma ORMをセットアップする

独自のPostgreSQL、MySQL、MongoDB、またはその他のサポートされているデータベースを使用してPrisma ORMを続行したい場合は、Prisma ORMセットアップガイドに従ってください。

Prisma Optimizeでクエリの洞察と分析を取得する

Prisma Optimizeは、洞察を生成し、データベースクエリを高速化するのに役立つ推奨事項を提供します。

Optimizeは、あらゆるスキルレベルの開発者が効率的なデータベースクエリを作成し、データベース負荷を減らし、アプリケーションの応答性を高めることを目的としています。

すぐに実行できるPrisma ORMの例を探る

お気に入りのライブラリでPrisma ORMがどのように使用できるかを確認するには、GitHubのprisma-examplesリポジトリをチェックしてください。このリポジトリには、Express、NestJS、GraphQLの例や、Next.js、Vue.jsを使用したフルスタックの例など、多数の例が含まれています。

Prisma Accelerateでデータベースクエリを高速化する

Prisma Accelerateは、データベースクエリを劇的に高速化できる接続プーラーとグローバルデータベースキャッシュです。スピードテストを試すか、お気に入りのフレームワークでAccelerateを試してみてください。

デモ説明
nextjs-starterPrisma Accelerateのキャッシュとコネクションプーリングを使用するNext.jsプロジェクト
svelte-starterPrisma Accelerateのキャッシュとコネクションプーリングを使用するSvelteKitプロジェクト
solidstart-starterPrisma Accelerateのキャッシュとコネクションプーリングを使用するSolidstartプロジェクト
remix-starterPrisma Accelerateのキャッシュとコネクションプーリングを使用するRemixプロジェクト
nuxt-starterPrisma Accelerateのキャッシュとコネクションプーリングを使用するNuxt.jsプロジェクト
astro-starterPrisma Accelerateのキャッシュとコネクションプーリングを使用するAstroプロジェクト

Prisma ORMでアプリを構築する

Prismaブログでは、Prisma ORMに関する包括的なチュートリアルを公開しています。最新のものをチェックしてください。


Prismaとのつながりを保つ

Prismaの旅を続けるために、以下とつながりましょう。 私たちの活発なコミュニティ。情報を入手し、参加し、他の開発者と協力しましょう。

  • Xでフォローする お知らせ、ライブイベント、役立つヒントのために。
  • Discordに参加する 質問したり、コミュニティと話したり、会話を通じて積極的なサポートを受けたりできます。
  • YouTubeを購読する チュートリアル、デモ、ストリーミングのために。
  • GitHubで交流する リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりしてください。
皆様のご参加を心より歓迎し、コミュニティの一員となっていただけることを楽しみにしております!

© . All rights reserved.