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
模式:不敏感: 執行不區分大小寫的搜尋。
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 將首先按第一個欄位排序,然後按第一個欄位中相同值組中的第二個欄位排序,依此類推。
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
您可以控制排序中如何處理空值。 nulls 選項可以設定為第一個或最後一個。
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
預設情況下,依升序排序時,空值放在最後;依降序排序時,空值放在最前面。 nulls 選項可讓您覆寫此預設行為。
Prisma 擅長優雅地處理資料庫關係。以下是關鍵方面:
在架構中定義關係:您可以使用 @relation 屬性直接在 schema.prisma 檔案中定義模型之間的關係。
關係類型: Prisma 支援:
讓我們使用前面範例中的 User 和 Post 模型:
mkdir prisma-example cd prisma-example
希望這可以幫助您更好地理解 Prisma ORM。
歡迎提出您的回饋和建議。
感謝您的閱讀! ?
以上是Prisma ORM:使用 JS 開始到結束項目的詳細內容。更多資訊請關注PHP中文網其他相關文章!