Prisma: Node.js および TypeScript 用の次世代 ORM
ORM: オブジェクト リレーション マッピングは、複雑なクエリを作成することなく、OOP 言語を使用してデータベースと通信する方法です。
mkdir prisma-example cd prisma-example
npm init -y
npm install prisma dotenv express --save-dev
npm install @prisma/client --save-dev
これにより、データベースの Prisma クライアントがインストールされます。
npx prisma init
これにより、以下を含む prisma ディレクトリが作成されます。
ビデオでは PostgreSQL を使用していると思われますが、これを MySQL、SQLite、またはその他に適応させることもできます。この例では、PostgreSQL を使用します。
.env ファイルに接続文字列を追加します。 PostgreSQL の例:
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
your_user、your_password、および your_database を実際の資格情報に置き換えます。ローカル PostgreSQL サーバーがない場合は、サーバーをインストールして構成する必要があります。
prisma/schema.prisma の内容を次のものに置き換えます:
mkdir prisma-example cd prisma-example
npm init -y
これにより、node_modules/@prisma/client にタイプセーフな Prisma クライアントが生成されます。
npm install prisma dotenv express --save-dev
これにより、prisma/migrations ディレクトリに新しい移行ファイルが作成され、それがデータベースに適用され、テーブルが作成されます。 --name init は、移行にわかりやすい名前を付けます。
ルート ディレクトリに db.config.js ファイルを作成し、次のコードを追加します。
npm install @prisma/client --save-dev
これにより、PrismaClient の新しいインスタンスが作成され、他のファイルで使用できるようにエクスポートされます。 log: ['query'] オプションは、すべてのクエリをコンソールに記録します。
プロジェクトのルートにcontrollers.jsファイルを作成します。以下は、controllers.js ファイル内の CRUD 操作のコードです:
npx prisma init
プロジェクトのルートにroutes.jsファイルを作成します。以下は、routes.js ファイル内の CRUD 操作のコードです:
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
プロジェクトのルートにserver.jsファイルを作成します。以下は、server.js ファイル内の CRUD 操作のコードです:
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
npx prisma generate
これによりスクリプトが実行され、データベースにユーザーと投稿が作成され、ユーザーが更新されて投稿が削除されます。
Postman を使用して、次のルートで API をテストできます:
Postman で POST リクエストの本文を次のデータを含む JSON として設定します。
npx prisma migrate dev --name init
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
Prisma には、データベース クエリ内で直接データ セットの計算を実行できるいくつかの集計関数が用意されています。これらの関数は、大量のデータをアプリケーションにフェッチすることなく、データを要約して洞察を得るのに役立ちます。
次の製品モデルがあると仮定しましょう:
mkdir prisma-example cd prisma-example
npm init -y
npm install prisma dotenv express --save-dev
npm install @prisma/client --save-dev
npx prisma init
Prisma は、データベースを正確にクエリできる豊富なフィルタリング オプションを提供します。以下に例を示した包括的な概要を示します:
等しい (デフォルト): 完全に等しいかどうかをチェックします。
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
not: 条件を否定します。
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
gt (より大きい)、gte (より大きいか等しい)、lt (より小さい)、lte (より小さいか等しい): 数値と日付/時刻の比較に使用されます。
npx prisma generate
次の内容が含まれます: 文字列に部分文字列が含まれているかどうかを確認します。
npx prisma migrate dev --name init
startsWith: 文字列がプレフィックスで始まるかどうかを確認します。
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
endsWith: 文字列がサフィックスで終わるかどうかを確認します。
import prisma from "./db.config.js"; // create user export const createUser = async (req, res) => { const { name, email } = req.body; const existing_user = await prisma.user.findUnique({ where: { email, }, }); if (existing_user) { return res.status(400).json({ message: "User already exists" }); } const user = await prisma.user.create({ data: { email, name, }, }); return res.status(201).json(user); }; // create post export const createPost = async (req, res) => { const { title, content, user_id } = req.body; const post = await prisma.post.create({ data: { title, content, user_id, }, }); return res.status(201).json(post); }; // get all users export const getUsers = async (req, res) => { const users = await prisma.user.findMany({ include: { posts: true, }, }); return res.status(200).json(users); }; // read specific user by id export const getUserById = async (req, res) => { const { id } = req.params; const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, include: { posts: true, }, }); if (!user) { return res.status(404).json({ message: "User not found" }); } return res.status(200).json(user); }; // update user export const updateUser = async (req, res) => { const { id } = req.params; const { name, email } = req.body; const user = await prisma.user.update({ where: { id: parseInt(id), }, data: { name, email, }, }); return res.status(200).json(user); }; // delete user export const deleteUser = async (req, res) => { const { id } = req.params; const user = await prisma.user.delete({ where: { id: parseInt(id), }, }); return res.status(200).json(user); }; // create similar for post
mode: insensitive: 大文字と小文字を区別しない検索を実行します。
import express from "express"; import { createUser, createPost, getUsers, getUserById, updateUser, deleteUser, } from "./controllers.js"; const router = express.Router(); router.post("/users", createUser); router.get("/users", getUsers); router.get("/users/:id", getUserById); router.put("/users/:id", updateUser); router.delete("/users/:id", deleteUser); // create similar for post router.post("/posts", createPost); // router.get('/posts', getPosts); // router.get('/posts/:id', getPostById); // router.put('/posts/:id', updatePost); // router.delete('/posts/:id', deletePost); export default router;
in: リストに値が存在するかどうかを確認します。
import express from "express"; import dotenv from "dotenv"; import router from "./routes.js"; dotenv.config(); const app = express(); app.use(express.json()); app.use("/api", router); const PORT = process.env.PORT || 5000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
notIn: 値がリスト内に存在しないかどうかを確認します。
node index.js
AND: 複数の条件を論理 AND で結合します。
{ "name": "John Doe", "email": "sample@example.com" }
OR: 複数の条件を論理 OR で結合します。
// get all posts of a user with id const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, include: { posts: true, }, }); // select specific fields of user with post details const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, select: { name: true, posts: { select: { title: true, content: true, }, }, }, }); // get all users name with their posts count (Aggregation) const req_data = await prisma.user.findMany({ select: { id: true, name: true, _count: { select: { post: true, }, }, }, });
NOT: 条件のグループを否定します。
model Product { id Int @id @default(autoincrement()) name String price Float category String createdAt DateTime @default(now()) }
関連モデルに基づいてフィルタリングできます。
mkdir prisma-example cd prisma-example
npm init -y
これらの演算子を組み合わせて、複雑なフィルタリング ロジックを作成できます。
npm install prisma dotenv express --save-dev
これらの例は、Prisma での最も一般的なフィルタリング シナリオをカバーしています。これらの演算子とネストされたフィルターを組み合わせることで、非常に正確なクエリを作成して、必要な正確なデータを取得できます。最新の詳細情報については、必ず Prisma の公式ドキュメントを参照してください。
Prisma の orderBy オプションを使用すると、クエリの結果を並べ替えることができます。その使用法を示すいくつかの例を次に示します。
昇順 (デフォルト):
npm install @prisma/client --save-dev
降順:
npx prisma init
複数のフィールドを指定して、それぞれに異なる方向で並べ替えることができます。 Prisma は、まず最初のフィールドで並べ替え、次に最初のフィールドの同一値のグループ内の 2 番目のフィールドで並べ替えます。
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
この例では、投稿は主に作成者の名前によって昇順に並べ替えられます。複数の投稿に同じ投稿者が含まれている場合は、タイトルの降順で並べ替えられます。
前の例で示したように、関連モデルのフィールドごとに並べ替えることができます。
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
これにより、投稿者の電子メール アドレスに基づいて投稿が並べ替えられます。
日付と時刻のフィールドでも注文できます。
npx prisma generate
あるフィールドでフィルタリングし、別のフィールドで並べ替えることができます。たとえば、名前に「test」を含むすべてのユーザーを検索し、電子メール アドレスで並べ替えたい場合があります。
npx prisma migrate dev --name init
並べ替えでの null 値の処理方法を制御できます。 null オプションは、first または last のいずれかに設定できます。
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
デフォルトでは、昇順で並べ替える場合は null 値が最後に配置され、降順で並べ替える場合は最初に配置されます。 null オプションを使用すると、このデフォルトの動作をオーバーライドできます。
Prisma はデータベース関係をエレガントに処理することに優れています。重要な側面は次のとおりです:
スキーマでの関係の定義: @relation 属性を使用して、schema.prisma ファイルでモデル間の関係を直接定義します。
関係のタイプ: Prisma がサポートするもの:
前の例の User モデルと Post モデルを使用してみましょう:
mkdir prisma-example cd prisma-example
これが Prisma ORM をより良く理解するのに役立つことを願っています。
フィードバックやご提案をお気軽にお寄せください。
読んでいただきありがとうございます! ?
以上がPrisma ORM: JS を使用したプロジェクトの開始から終了までの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。