Prisma 使用教程

Prisma 是一個有趣的 ORM(Object-Relational Mapping)。

ORM 是一個對數據庫的抽象層。

在過去的幾個月中,我有幸在幾個不同的項目中使用了 Prisma,現在我想向您展示如何輕鬆入門(並不斷前進)。

我將在基於 Next.js 的 React 應用程序中使用 Prisma。

您可以創建一個新的 Next.js 應用程序文件夾:

npx create-next-app

要添加 Prisma,您首先需要在開發依賴中包括 prisma

npm install -D prisma

現在,您可以使用 npx 命令訪問 Prisma CLI 工具。嘗試運行:

npx prisma

您將看到如何使用它的說明。

現在運行以下命令為您的項目設置 Prisma:

npx prisma init

這將創建一個 prisma 文件夾,在其中創建一個 schema.prisma 文件:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

datasource db {
 provider = "postgresql"
 url = env("DATABASE\_URL")
}

generator client {
 provider = "prisma-client-js"
}

它還將創建一個 .env 文件(如果您之前沒有),其中包含 DATABASE_URL 環境變量:

DATABASE\_URL="postgresql://johndoe:[[email protected]](/cdn-cgi/l/email-protection):5432/mydb?schema=public"

這個環境變量需要指向您的數據庫。

首先,讓我們解釋一下。Prisma 支持多種不同類型的(關聯)數據庫。我已經使用過 PostgreSQLSQLite,但它還支持 MySQL、AWS Aurora 和 MariaDB。

在生產中,我喜歡使用 DigitalOcean 的托管數據庫(這是一個帶有免費 $100 信用額度的強制引薦鏈接這裡),但對於一個快速的示例應用程序,Railway.app 是一個很酷且免費的選擇。

註冊後,您可以點擊一下來提供 PostgreSQL 數據庫:

然後,您將立即獲取連接 URL:

將連接 URL 複製到您的 .env 文件中,作為 DATABASE_URL 的值。

現在是時候在模式中添加一個模型了,該模型將轉換為數據庫表格。

請注意,您也可以按相反的方式做,即如果您已經有了一個已經填充了表格的數據庫,可以運行 npx prisma introspect 來從數據庫生成模式。 Prisma 將從數據庫生成模式。

假設我們是一個喜歡收集汽車的奢侈億萬富翁。我們創建一個 Car 模型來存儲我們想要購買的汽車列表:

model Car {
 id Int @id @default(autoincrement())
 brand String
 model String
 created_at DateTime @default(now())
 bought Boolean @default(false)
}

我強烈建議您查閱 Prisma 模式參考文檔 中的所有內容。

此模型定義了 5 個字段:idbrandmodelcreated_atbought,每個字段都有其類型,包括 Int、String、DataTime 和 Boolean。

id 具有 @id 屬性,這意味著它是主鍵,這告訴數據庫管理系統使其唯一。它默認為自動遞增的值,因此每次添加一個新項目時,它都有一個唯一的整數序號:1、2、3、4…

請注意,您還可以使用唯一值和 @default(cuid())@default(uuid())

created_at 使用 @default(now()) 默認為當前日期時間,bought 默認為 false

現在,我們需要使用我們的模式來同步數據庫。我們可以通過運行命令 npx prisma migrate 來創建我們的第一個遷移(migration)

npx prisma migrate dev

現在您可以在數據庫中看到 Car 表:

還有程式碼庫內的 prisma/migrations 文件夾中的文件,其中包含用於創建這些表的命令,例如:

-- CreateTable
CREATE TABLE "Car" (
 "id" SERIAL NOT NULL,
 "brand" TEXT,
 "model" TEXT,
 "created\_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT\_TIMESTAMP,
 "bought" BOOLEAN NOT NULL DEFAULT false,

 PRIMARY KEY ("id")
);

每次更改模式時,您都需要運行 npx prisma migrate dev 命令來應用更改。

太好了!現在我們可以使用 Prisma 將數據插入到數據庫中、檢索數據、刪除數據…等等。

現在使用以下命令安裝 @prisma/client 套件:

npm install @prisma/client

創建一個名為 lib 的文件夾,在其中創建一個 prisma.js 文件。在該文件中,我們初始化 PrismaClient 對象:

import { PrismaClient } from '@prisma/client'

let global = {}

const prisma = global.prisma || new PrismaClient()

if (process.env.NODE\_ENV === 'development') global.prisma = prisma

export default prisma

這段代碼是為了避免在開發模式下多次實例化 Prisma,因為我們會頻繁刷新(熱模塊重加載)。我們在第一次運行時將 prisma 添加到一個全局變量中,下一次重用該變量。

現在,在您希望使用 Prisma 的任何文件中,您可以添加以下代碼:

import prisma from 'lib/prisma'

然後您就可以開始使用了。

使用 prisma.car.findMany() 檢索所有汽車:

const cars = await prisma.car.findMany()

您可以通過傳遞一個對象來過濾數據,例如選擇所有 Ford 汽車:

const cars = await prisma.car.findMany({
 where: {
 brand: 'Ford',
 },
})

您可以根據 id 值查找單個汽車,使用 prisma.car.findUnique()

const car = await prisma.car.findUnique({
 where: {
 id: 1,
 },
})

使用 prisma.car.create() 添加新的汽車:

const car = await prisma.car.create({
 brand: 'Ford',
 model: 'Fiesta',
})

使用 prisma.car.delete() 刪除汽車:

await prisma.job.delete({
 where: { id: 1 },
})

使用 prisma.car.update() 更新汽車的數據:

await prisma.job.delete({
 where: { id: 1 },
 data: {
 bought: true
 }
})

您還可以做更多事情,但這些是基礎知識,這就足夠讓您入門,並且在簡單的 CRUD 應用程序中滿足 95% 的需求。