Prisma,如何清空資料庫

在測試使用Prisma的網站時,我經常需要清空資料庫,以清除我輸入的測試資料。 你可以使用以下方法來清除資料: await prisma.user.deleteMany({}) 如果出於某些原因你需要逐個進行處理,可以按以下方式對它們進行迭代: const users = await prisma.user.findMany({}) const deleteUser = async (user) => { return await prisma.user.delete({ where: { id: user.id } }) } const deleteUsers = async () => { users.map((user) => deleteUser(user)) } deleteUsers() 在這個例子中,其實比前面的例子多了些冗余程式碼,但你可以在deleteUser()中進行更多操作。 然而,我遇到了一個問題,因為兩個表之間存在關聯,即tweets和users。一篇tweet與一個user相關聯。所以我需要先刪除所有的tweets,然後再刪除所有的users。為此,我編寫了以下函數: export const clearData = async (prisma) => { const users = await prisma.user.findMany({}) const tweets = await prisma.tweet.findMany({}) const deleteUser = async (user) => { return await prisma.user.delete({ where: { id: user....

Prisma關聯

Prisma關聯解決了數據庫和數據處理的一個重大問題。 假設您的應用程序中有一個用戶列表,他們發表推文(想像Twitter)。 在您的schema中,您可以以以下方式定義這兩個實體之間的關係: model Tweet { id Int @id @default(autoincrement()) text String author User @relation(fields: [authorId], references: [id]) authorId Int } model User { id Int @default(autoincrement()) @id tweets Tweet[] } 當您創建一個新的推文時,您可以通過以下方式將其與ID為1的用戶關聯起來: await prisma.tweet.create({ data: { text: req.body.content, author: { connect: { id: 1 } } } }) 然後,當您獲取一個推文時,您可以檢索到作者的信息: await prisma.tweet.findMany({ include: { author: true } }) 您還可以創建一個用戶並將與其關聯的推文填充到數據庫中: await prisma.user.create({ data: { tweets: { create: [ { text: 'test' }, { text: 'test2' }, ] } } })

SQL注入

SQL注入是對於使用SQL查詢的基於數據庫的應用程序而言的最大威脅之一,並且與輸入數據消毒聯繫在一起。 假設我們使用Node.js運行這樣一個簡單的查詢(這裡使用偽代碼): const color = //來自用戶輸入 const query = `select * from cars where color = '${color}'` 如果color是一個包含顏色(如red或blue)的字符串,一切正常運作。 但是如果你接受來自表單中input字段的字符串,並且攻擊者輸入字符串"blue';drop table cars;",你看到發生了什麼嗎? 現在query的值是: select * from cars where color = 'blue';drop table cars;' 如果你執行這個查詢,除非你在數據庫使用者的權限中移除了刪除表的選項,否則這將刪除所有數據。 再舉個例子。 假設你執行這樣一個查詢: const query = 'SELECT * FROM users where name = "' + name + '"' 如果你接受來自表單的name變量,並且沒有對其進行消毒,有人可能輸入以下值: flavio"; DELETE * FROM users; SELECT * FROM users where name ="flavio 看到了嗎?現在查詢變成了: SELECT * FROM users where name = "flavio"; DELETE * FROM users; SELECT * FROM users where name ="flavio" 這將導致用戶表被刪除。...

在 Prisma 中使用多個字段作為唯一鍵

我在使用 Prisma 遇到了一個問題,讓我浪費了一些時間,所以我將寫下我是如何解決它的。 模型中沒有一個標記為 @id 的 id 字段,所以我添加了一個 @@unique(),表示 user 和 tweet 共同定義了唯一約束。 model Like { user Int tweet Int createdAt DateTime @default(now()) @@unique([user, tweet]) } 這意味著我們不能有多個相同的 (user, tweet) 條目。 當我嘗試刪除一個條目時: await prisma.like.delete({ where: { user: 1, tweet: 1 } }) 我遇到了以下錯誤消息: PrismaClientValidationError: Invalid `prisma.like.delete()` invocation: { where: { user: 12, ~~~~ tweet: 22 ~~~~~ } ~~~~~~~~~~~ } Argument where of type LikeWhereUniqueInput needs exactly one argument, but you provided user and tweet....

如何使用 Prisma

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" } 它還將創建一個 ....

如何使用 Prisma 反向排序

我使用 Prisma 從資料庫中取得資料。 在我的情況中,我從 Tweets 資料表中取得推文,它們按照最舊到最新的順序列出。 我希望像 Twitter 一樣相反,最新的推文會最先顯示。 所以我修改了我的資料擷取程序: await prisma.tweet.findMany({ orderBy: [ { id: 'desc' } ] });

如何使用 Supabase 作為你的 PostgreSQL 托管

最近我發現你可以將 Supabase 作為你的 PostgreSQL 托管。 Supabase 是一個非常有趣的項目。它不僅僅是一個「數據庫托管」,同時也是一個可以用來進行應用程序開發的平台。它是建立在 PostgreSQL 之上的,並且提供了一個免費的 連接池,可以幫助我們避免在使用 Prisma 時耗盡數據庫連接限制的問題。 他們在免費帳戶中允許最多兩個專案,所以值得一試。 你也可以開展一個新的項目,然後在完成後刪除舊的項目。 Supabase 將自己定位為 Firebase 的替代品,除了數據庫外,還提供了身份驗證、訂閱等功能,你可以稍後再進一步探索。 注意:Supabase 也可以自托管,這樣你的兩個項目限制就會消失,但同時你需要自行管理基礎架構。 設置時,首先在 supabase.com 上使用 GitHub 登錄。 然後創建一個新的項目 然後進入“Settings”→“Database”,滾動到底部,你會找到直接連接到數據庫的連接字符串(點擊 URI) 這就是你需要將其放入 .env 文件中的 DATABASE_URL 變量。 請輸入在創建 Supabase 項目時為該項目設置的密碼。 如果你現在使用 Prisma,你可以運行 npx prisma migrate dev 從 Prisma schema 創建表。 這樣就可以連接到數據庫了,但由於 Supabase 提供了連接池,可以幫助我們免於耗盡對數據庫的連接。為什麼不使用它呢? 如果你使用 Prisma:在使用 npx prisma migrate dev 時連接池無法正常工作,對於該命令,你必須使用上面所示的直接數據庫連接字符串。所以請記住在需要時更換 DATABASE_URL 的值。 下面是連接池連接字符串: 將它複製到你的 .env 文件中,並在末尾添加 ?pgbouncer=true 如此處所述。

如何修復 `Already 10 Prisma Clients are actively running` 錯誤

我在我的 Next.js 應用中使用 Prisma,但是我做錯了。 我在每個頁面都初始化了一個新的 PrismaClient 對象: import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() 但是在應用使用一段時間後,我收到了錯誤訊息 Already 10 Prisma Clients are actively running 和 Address already in use。 為了解決這個問題,我將 Prisma 初始化的程式碼抽取到一個單獨的文件 lib/prisma.js 中: import { PrismaClient } from '@prisma/client' let prisma if (process.env.NODE_ENV === 'production') { prisma = new PrismaClient() } else { if (!global.prisma) { global.prisma = new PrismaClient() } prisma = global.prisma } export default prisma 進行生產環境的檢查是因為在開發模式下,npm run dev 會在運行時清除 Node....

如何修復 Next.js 中的錯誤“PrismaClient 無法在瀏覽器上運行”

我在 Next.js 網站上遇到了這個錯誤: PrismaClient 無法在瀏覽器上運行 我擁有這個頁面,並且它一切正常,直到我在代碼中註釋了一行,特別是在我的 getStaticProps() 方法中。 在那一行中,我調用了我在頁面文件頂部導入的 Prisma 實例的方法。 基本上,Next.js 會查看我們在 getStaticProps() 中使用的代碼並將其用於後端。它不會將其發送到前端。 當我在 getStaticProps() 中註釋掉使用 Prisma 的那行時,Next.js 將 Prisma 包含在我的前端代碼中,然後我就會收到該錯誤“PrismaClient 無法在瀏覽器上運行”。 解決方法是也註釋(或刪除)Prisma導入。 同時,請記住 getStaticProps() 只在頁面路由中被調用,而不是在其他組件中,所以如果這個錯誤來自一個組件,你必須將邏輯移至頁面路由組件。

如何解決在 Vercel 上出現的 `prisma/client did not initialize yet` 錯誤

我使用 Next.js 和 Prisma 構建了一個應用程序,當我嘗試在 Vercel 上部署時,遇到了以下部署錯誤: Error: @prisma/client did not initialize yet. Please run "prisma generate" and try to import it again. 數據庫已經在我的本地開發安裝中初始化,我只需要使用它。 我如何解決這個問題呢? 首先,我將 prisma 安裝為 dev 依賴: npm i -D prisma 然後,我在 package.json 的 scripts 中添加了以下內容: { "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "postinstall": "prisma generate" }, "dependencies": { //... }, "devDependencies": { //... "prisma": "^2.24.1", } } 這解決了問題。