為什么你要考慮使用Prisma
Prisma正迅速成為我的首選ORM框架,這是有原因的。在我們創(chuàng)建一個(gè)web項(xiàng)目時(shí),設(shè)置鏈接數(shù)據(jù)庫(kù)一直是一項(xiàng)比較繁瑣的任務(wù)。雖然ORM已經(jīng)存在了一段時(shí)間,并且在大多數(shù)情況下已經(jīng)簡(jiǎn)化了這個(gè)過程。然而,它們似乎總是在某個(gè)方面有所欠缺。
對(duì)于一個(gè)開發(fā)人員來說,每一個(gè)ORM框架,通常都有一些開發(fā)人員希望它能做得更好一點(diǎn)。但對(duì)我來說,它這個(gè)設(shè)計(jì)模式紿我?guī)砹丝焖俨榭春途庉嫈?shù)據(jù)的能力。Prisma為我解決這些問題的同時(shí)也解決了一些我不知道的問題。
什么是Prisma
Prisma稱自己為下一代 Node.js、TypeScript、Go 的數(shù)據(jù)庫(kù) ORM框架
Prisma是一個(gè)開源的數(shù)據(jù)庫(kù)工具鏈項(xiàng)目,幫助開發(fā)人員更快地構(gòu)建應(yīng)用程序并減少錯(cuò)誤,支持PostgreSQL、MySQL、MongoDB、SQL Server和SQLite。
Prisma Schema
Prisma的核心是通過Primsa Schema文件來定義數(shù)據(jù)模型。它是用一種叫做PSL(Prisma Schema Language)的屬性語言編寫的,這需要幾分鐘時(shí)間來熟悉。Schema文件主要有三個(gè)主要組成部分。首先是你的數(shù)據(jù)源datasource,這個(gè)配置數(shù)據(jù)庫(kù)的URL和數(shù)據(jù)庫(kù)類型的地方。在這種情況下,provider用來表示使用的數(shù)據(jù)庫(kù)的類型。如下所示:
datasource db {
url = env("DATABASE_URL")
provider = "postgresql"
}
下一個(gè)部分是生成器(Generator)字段。這個(gè)字段指定了應(yīng)該根據(jù)數(shù)據(jù)模型生成什么客戶端。這個(gè)功能就是讓你如何使用Prisma生成的客戶端來CRUD。這些我們稍后會(huì)介紹,這一部分看起來像這樣:?
generator client {
provider = "prisma-client-js"
}
最后,我們要定義我們的應(yīng)用模型數(shù)據(jù)模型(Data model)在數(shù)據(jù)庫(kù)中的字段 ,這將是這個(gè)文件的重點(diǎn)。在這里你創(chuàng)建你的應(yīng)用模型和數(shù)據(jù)間的映射關(guān)系。這一部分也需要最長(zhǎng)的時(shí)間來適應(yīng),然而,它看起來仍然會(huì)顯得很熟悉。PSL不是創(chuàng)建普通的JS對(duì)象,而是以一種不同的方式來格式化模型,但所有的字段都與你習(xí)慣的交互方式相同。下面這個(gè)就是一個(gè)用戶模型的例子:
model User {
id Int (autoincrement())
createdAt DateTime (now())
email String
name String?
role Role (USER)
posts Post[]
}
這個(gè)用戶模型我們有一個(gè)有六個(gè)字段,"id "是一個(gè)整數(shù),并有一個(gè)默認(rèn)值且自增。還有一些標(biāo)準(zhǔn)的,其它的、唯一的類型屬性你可以在 官方文檔) 中探索。你的下一個(gè)問題可能是 "模型間的關(guān)聯(lián)關(guān)系是如何工作的?",幸好它們相當(dāng)簡(jiǎn)單易懂。下面是一個(gè)用戶發(fā)的帖子的模型。
model Post {
id Int (autoincrement())
createdAt DateTime (now())
updatedAt DateTime
published Boolean (false)
title String .VarChar(255)
author User? (fields: [authorId], references: [id])
authorId Int?
}
這個(gè)關(guān)聯(lián)關(guān)系定義在帖子的作者字段中。意思非常簡(jiǎn)單,author字段是一個(gè)用戶,它引用了用戶模型User。然后我們創(chuàng)建一個(gè)關(guān)聯(lián)關(guān)系,用貼子模型Post上的字段 "authorId "引用用戶模型User中的 "id "字段。最后一個(gè)要解決的大問題是使你的數(shù)據(jù)庫(kù)與你的定義的模型保持同步,Prisma通過Prisma Migrate做到這一點(diǎn)。這是一個(gè)簡(jiǎn)單的命令行,可以將你的數(shù)據(jù)庫(kù)與你可能有的任何變化一起遷移,具體可參考 官方文檔的遷移功能。<a name="v8LM3"></a>。
CRUD
記住你的Prisma Schema文件中的生成器Generator部分,這里是你要使用的地方。你的Generator塊是Prisma用來決定如何建立其客戶端的東西。它的建立是為了對(duì)你的數(shù)據(jù)進(jìn)行類型安全的查詢。這意味著查詢你查詢數(shù)據(jù)的操作函數(shù)將變得更加容易理解和使用。
const newUser = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
},
})
const users = await prisma.user.findMany()
這是一個(gè)創(chuàng)建和查找用戶的例子。當(dāng)為你的數(shù)據(jù)生成一個(gè)客戶端時(shí),Prisma將方法添加到Prisma對(duì)象中,與你的數(shù)據(jù)完全相關(guān)。繼續(xù)以用戶和帖子為例,我們也將能夠做到這一點(diǎn)。
prisma.post.create()
如果要想進(jìn)一步了解更多復(fù)雜的查詢操作,請(qǐng)查看這里。<a name="DrufO"></a>。
Prisma的好處
Introspection
這里至少有兩個(gè)特點(diǎn)讓我至少考慮它,對(duì)于任何項(xiàng)目,即使是那些我已經(jīng)在使用不同的ORM的項(xiàng)目。Introspection是一項(xiàng)功能,它允許你使用你已經(jīng)創(chuàng)建的數(shù)據(jù)庫(kù)來生成一個(gè)與你的數(shù)據(jù)庫(kù)相匹配的Prisma模式。因此,如果你有一個(gè)已經(jīng)按你喜歡的方式設(shè)置的數(shù)據(jù)庫(kù),但想嘗試Prisma,這個(gè)過程是無縫和簡(jiǎn)單的。你的Prisma Schema文件已經(jīng)生成,你可以立即開始使用Prisma。所有這些都在一個(gè)單一的命令中完成。
prisma db pull
Prisma Studio
Prisma還創(chuàng)建了一個(gè)本地的web客戶端,你可以隨時(shí)的改變或更新數(shù)據(jù)。Prisma Studio對(duì)于快速檢查數(shù)據(jù)或改變一些東西進(jìn)行測(cè)試是非常好的。它可能不像PgAdmin或MySql Workbench那樣先進(jìn),但它仍然為大多數(shù)數(shù)據(jù)庫(kù)工作提供了足夠的選擇。我唯一不滿意的是,你不能像使用Sanity那樣定制外觀界面。