10 分で Koa + Prisma をマスターしてデータベース CRUD を実装する
序文
Prisma はいわゆる次世代 ORM ツールで、これも TypeScript に基づいて実装されていますが、強力な型安全性をもたらします。
この記事では、Koa.js を使用して単純な Web サービスを構築し、MySQL データベースと連携して、Prisma を通じてデータを追加、削除、変更、クエリする方法を示します。
プリズマ
Prismaはいわゆる次世代 ORM ツールで、技術系 Web サイトの中でも非常に優れた中国語 Web サイトと言えるPrisma の中国語 Web サイトは次のとおりです。
Prisma は、単なる ORM ツールではなく、オープンソース データベース ツールチェーン プロジェクトです。サポートするデータベースには、PostgreSQL、MySQL、MongoDB、SQL Server、SQLite が含まれます。この記事では、デモのために MySQL を使用します。
使い方に関しては、初めて触れる人にとっては少し面倒です。以下のプロセスをまとめました。
- 依存関係をインストールする
- Prismaプロジェクトを初期化する
- Prisma スキーマの設計 (データベース情報とモデル)
- データベースと同期する
- Prismaクライアントの生成
- Prisma Client を使用して CRUD を完了する
まずは開発環境を構築してから、戻って Prisma の導入を続けてみましょう。
環境を初期化する
Koa を使用して Web サービスをすばやく構築し、最初にディレクトリを作成して依存関係をインストールします。
$ mkdir koa-prisma
$ cd koa-prisma
$ pnpm init
# 安装 Koa 依赖
$ pnpm add koa @koa/router koa-bodyparser
- @koa/router: ルーティング機能を統合しやすいルーティングミドルウェア
- koa-bodyparser: リクエスト本文データを解析し、ctx.request.body オブジェクトに配置します。
次に、新しいものを作成してindex.js
、単純な Web サービスを完成させます。
const Koa = require('koa')
const Router = require('@koa/router')
const bodyParser = require('koa-bodyparser')
const app = new Koa()
// 实例化路由器,并设置公共路由前缀 /users
const router = new Router({
prefix: '/users'
})
app.use(bodyParser())
// 查询用户列表
router.get('/', async ctx => {
})
// 查询单个用户
router.get('/:id', async ctx => {
})
// 创建用户
router.post('/', async ctx => {
})
// 更新用户
router.patch('/:id', async ctx => {
})
// 删除用户
router.delete('/:id', async ctx => {
})
// 注册路由中间件
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000, () => {
console.log('服务器运行在 3000 端口')
})
上記のコードでは、データベースのクエリ、挿入、更新、削除の操作に対応する 5 つのルーティング メソッドが定義されています。後で Prisma の初期化を完了し、Prisma Client を導入すると、これらのインターフェイスが実現できます。
次に、nodemon
コマンドを使用してサービスを開始します。使いやすいように、このモジュールをグローバルにインストールすることをお勧めします。
$ nodemon src/index.js
プリズマ CLI
まず、Prisma の 2 つの依存モジュールをインストールします。
$ pnpm add -D prisma
$ pnpm add @prisma/client
最初にインストールされる Prisma は CLI コマンドです。これは主に、データベースの移行、Prisma クライアントの作成など、Prisma のさまざまな機能を呼び出すために使用されます。
次のコマンドを実行して、prisma の使用方法を確認します。
$ npx prisma --help
ご覧のとおり、prisma には 7 つのコマンドが用意されています。
注文 | 説明する |
---|---|
初期化 | アプリケーションでPrismaを初期化する |
生成する | 主にPrisma Clientの生成に使用されます。 |
データベース | データベースのスキーマとライフサイクルを管理する |
移行する | データベースを移行する |
スタジオ | Web 側ワークベンチを開始してデータを管理する |
検証 | Prisma のスキーマ ファイルの構文が正しいかどうかを確認してください |
フォーマット | Prisma のスキーマ ファイルをフォーマットします。デフォルトは prisma/schema.prisma です。 |
また、例も示しています。ここでは主にそのうちの 3 つを使用します。残りは、自分で効果を確認するために使用できます。
プリズマの初期化
次のコマンドを実行して初期化を完了します。
$ npx prisma init
このコマンドの効果は、次のように、コマンドが配置されているディレクトリ (現在のルート ディレクトリ) に.env
ファイルとディレクトリを作成しprisma
、このディレクトリにファイルを作成することです。schema.prisma
.env
このファイルは誰もがよく知っている、環境変数を配置するファイルであり、その中の環境変数は通常、構成情報です。
prisma
このディレクトリは Prisma 関連のファイルを格納するために使用されます。現在schema.prisma
ファイルは上記の Prisma スキーマ ファイル 1 つだけです。このファイルに接続情報とデータベースのモデルを定義します。
Prisma スキーマの設計
schema.prisma
これは Primsa を使用する主要な構成ファイルであり、Prisma スキーマ ファイルと呼ばれ、次の 3 つの基本構造が含まれています。
-
情報元
-
ビルダー
-
データモデルの定義
VSCプラグインをインストールする
パターン ファイルを編集する前に、 VS Code にPrisma
プラグインをインストールします。これにより.prisma
、コードの強調表示、書式設定、オートコンプリート、ジャンプ定義、およびファイルの検査機能が提供されます。このプラグインのサポートがなければ、スキーマ ファイルは単なるプレーン テキストになります。
セットビルダー
ジェネレーターを定義するために使用しgenerate
、プロバイダー属性を通じて宣言しますprisma-client-js
(現在、これのみをサポートしています)。コマンドを実行するとprisma generate
、Prisma Client が生成され、データの追加、削除、変更、クエリを実行するために使用されます。
generator client {
provider = "prisma-client-js"
}
データソースを設定する
データ ソースを定義するために使用しますdatasource
。Prisma が接続するデータベースを設定するために必要な情報です。provider
接続するデータベースのタイプです。デフォルトは postgresql ですが、使用する mysql に変更しました。url
データベースの URL です。通常、設定を分離するために、prisma cli によって自動的に生成される環境変数ファイルに個別に定義されます.env
。この関数を通じてenv()
、このファイル内の変数が読み取られます。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
.env
ファイルを見てください。デフォルトの接続は Postgresql です。
DATABASE_URL=postgresql://johndoe:mypassword@localhost:5432/mydb?schema=public
これはデータベース接続 URL の構成です。
以下は必須フィールドです。
名前 | プレースホルダー | 説明する |
---|---|---|
ホスト | HOST |
データベース IP またはドメイン名などlocalhost |
ポート | PORT |
データベースポート、例:3306 |
ユーザー | USER |
データベースのユーザー名、例:root |
パスワード | PASSWORD |
データベースのパスワード |
データベース | DATABASE |
データベース名(例)mydb |
この手順に従って、独自の MySQL URL を定義します。
DATABASE_URL="mysql://root:root123@localhost:3306/prisma"
ユーザーモデルを定義する
ORM ツールとして、モデルは不可欠なはずです。Prismaのモデルには主に以下の機能があります。
- アプリケーションドメインを構成するエンティティ
- データベース(PostgreSQL などのリレーショナル データベース) またはコレクション(MongoDB)にマップされたテーブル
- Prisma Client APIのクエリの基礎を形成します。
- TypeScript を使用する場合、Prisma Client はモデルとそのバリアントの型定義を提供し、データベース アクセスの型安全性を確保します。
形式のこれらの Prisma 組み込みユーティリティ関数は@id()
、モデルを定義するときに使用されます。@default()
たとえば、@id()
主キーの宣言やデフォルト値の設定に使用され@default()
、その命名は非常に意味論的であり、基本的には SQL のキーワードであり、非常に理解しやすいものです。
ユーザー モデルの定義は次のとおりです。
model User {
id Int @id @default(autoincrement())
name String
email String @unique
password String
createdTime DateTime @default(now()) @map("created_time")
updatedTime DateTime @updatedAt @map("updated_time")
@@map("user")
}
説明が必要な情報がいくつかあります:
@@map()
1. モデルの名前は、デフォルトで作成されたデータ テーブルの名前です。ここでは大文字の User が使用され、データ テーブル名も大文字の User になります。マップされたテーブル名を設定し、それを小文字のユーザーに変更するために使用できます。。
2. 各モデルのレコードは一意に識別可能です。つまり、@id を使用して宣言できる主キーが必要です。
3. Int や String などのフィールドの型は、Prisma を通じてデータベースの対応する型、つまり int と varchar に変換されます。
4.@unique
これは一意の値の制約であるため、生成されたユーザー テーブルの電子メール フィールドの値を繰り返すことはできません。
5. 作成時、更新時と同様、JSやTSの命名規則に従うためキャメルケースを使用しますが、データベースの命名規則に従うため、後からリマッピングしてアンダースコアを付けます@map()
。
データベースを同期する
Prisma モデルをデータベースに同期します。私たちのような新しいプロジェクト (空のプロジェクト) の場合は、次のコマンドを使用できます。
$ npx prisma db push
すでにデータがあるプロジェクトの場合、このコマンドは使用できず、prisma migrate
代わりに移行を使用します。この記事には関係ありません。
データベースのスキーマを作成し、Prisma スキーマを使用してデータベースを同期し、次のprisma generate
コマンドを「密かに」実行して Prisma クライアントを生成します。
prisma
データベースにアクセスして更新すると、データベースとテーブルが作成されますuser
。
Prismaクライアントを生成する
以前にデータベースを同期したときにすでに実行されていますprisma generate
。したがって、再度実行する必要はありませんが、モデルの変更など、Prisma Schema ファイルが変更された場合は、このコマンドを再度実行して Prisma Client を再生成する必要があります。
generate
コマンド実行の流れは以下の通りです。
CRUDの追加、削除、変更、クエリ
Prismaクライアントの初期化
Prisma Client を使用すると、CRUD 操作を実行できます。初期化:
const {
PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
Prisma Client のインスタンスである Prisma にはさまざまなタイプがあり、次の方法で使用できますprisma.模型.CRUD方法
。
まず、一般的に使用される API をいくつか紹介します。
- findMany: 複数のレコードをクエリする
- findUnique: 単一レコードをクエリします
- 作成: レコードを作成します
- 更新: レコードを更新します
- 削除: レコードを削除します
これらの API を使用してルーティング方式でデータベースを操作し、インターフェースの開発を完了します。
ユーザーリストのクエリ
findMany はパラメータを渡しません。つまり、ユーザー テーブル全体のすべてのレコードをクエリし、User モデルのインスタンスのコレクションである配列を返します。
router.get('/', async ctx => {
const users = await prisma.user.findMany()
ctx.body = users
})
単一のユーザーをクエリする
findUnique
このメソッドではwhere
、クエリ条件を設定します。つまり、指定された ID に従ってユーザー レコードをクエリします。このメソッドは、User
モデルのインスタンスである 1 つのレコードのみを返します。
// 查询单个用户
router.get('/:id', async ctx => {
const id = parseInt(ctx.params.id)
const user = await prisma.user.findUnique({
where: {
id }
})
ctx.body = user
})
注意すべき点の 1 つは、ctx.params.id
取得元はid
文字列型であるため、クエリを実行する前に整数型に変換する必要があることです。
ユーザーを作成
データを挿入するために使用しますcreate
。リクエスト本文から解析されたデータ、つまりUser
モデルを記述するオブジェクトを data 属性に割り当てるだけです。
router.post('/', async ctx => {
const user = ctx.request.body
const newUser = await prisma.user.create({
data: user
})
ctx.body = newUser
})
ユーザーを更新する
このメソッドを使用して、クエリ条件を設定しupdate
てwhere
ユーザーをクエリし、更新するデータを data に割り当てて,
更新を完了します。
router.patch('/:id', async ctx => {
const id = parseInt(ctx.params.id)
const updateUser = ctx.request.body
const user = await prisma.user.update({
where: {
id
},
data: updateUser
})
ctx.body = user
})
ユーザーを削除する
次のメソッドを使用して、delete
レコードを削除するためのクエリ条件を直接設定します。
router.delete('/:id', async ctx => {
const id = parseInt(ctx.params.id)
const user = await prisma.user.delete({
where: {
id
}
})
ctx.body = user
})
注: 更新と削除を使用する場合は、必ず where を設定してください。そうしないと、データ テーブル内のすべてのレコードが更新または削除され、非常に危険です。
テスト
ユーザーを作成:
ユーザーリストのクエリ:
ユーザーを更新します:
ユーザーを削除します:
要約する
完全なコードはここにあります。
この記事では、ユーザーの追加、削除、変更、クエリの例を通じて、Koa での Prisma の基本的な使用方法を説明します。
- 依存関係をインストールする
- プリズマの初期化
- Prisma スキーマの設定
- データベースを同期する
- Prismaクライアントの作成
- Prisma Client を使用した CRUD の実装
Prisma には優れた機能も数多くありますが、この記事では、単一のテーブルの追加、削除、変更、確認といった最も基本的な使い方を紹介します。Prisma について詳しく知るには、中国語のドキュメントサイトを読むことをお勧めします。
読んでくれてありがとう!