如何使用Prisma

436 阅读5分钟

Prisma是一个有趣的ORM。

ORM是数据库上的一个抽象层。

在过去的几个月里,我有幸在一些不同的项目中使用Prisma,在这里我想向你展示它是多么容易上手(和继续使用)。

我将在一个基于Next.js的React应用程序中使用Prisma。

你可以在一个文件夹中创建一个新的Next.js应用程序,其中包括

npx create-next-app

要添加Prisma,你要做的第一件事是在你的开发依赖项中包括prisma

npm install -D prisma

现在你可以通过使用npx 来访问Prisma CLI工具。尝试运行。

npx prisma

你会看到关于如何使用它的说明。

![](Screen Shot 2021-06-26 at 08.40.49.png)

现在运行这个来为你的项目设置Prisma。

npx prisma init

![](Screen Shot 2021-06-26 at 08.41.30.png)

这将创建一个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:randompassword@localhost:5432/mydb?schema=public"

这必须指向你的数据库。

让我们先把这一点说清楚。Prisma支持许多不同类型的(关系型)数据库。我曾在PostgreSQLSQLite中使用它,但它也支持MySQL、AWS Aurora和MariaDB。

在生产中,我喜欢使用DigitalOcean的管理数据库(强制性的推荐链接可获得100美元的免费信贷),但对于一个快速的示例应用程序,Railway.app是一个很酷的免费选择。

在你注册之后,你可以通过点击来提供一个PostgreSQL数据库。

![](Screen Shot 2021-06-26 at 08.50.10.png)

之后,你会立即得到连接的URL。

![](Screen Shot 2021-06-26 at 08.50.46.png)

把它复制到你的.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个字段。id,brand,model,created_at,bought, 每个字段都有其类型,可以是Int, String, DataTime, 或者Boolean。

id 有 属性,这意味着它是@id 主键,这告诉数据库管理系统要使它唯一。它的默认值是自动递增的,所以每当我们添加一个新的项目时,它总是有一个唯一的整数,会递增。1, 2, 3, 4...

注意,你也可以用@default(cuid())@default(uuid()) 来使用一个唯一的值。

created_at 使用 ,默认为当前日期时间,而 ,默认为 。@default(now()) bought false

现在我们需要将数据库与我们的模式进行同步。我们通过运行命令npx prisma migrate 来创建我们的第一次迁移

npx prisma migrate dev

现在你可以看到在数据库中,会有一个Car 表。

![](Screen Shot 2021-06-26 at 09.16.16.png)

![](Screen Shot 2021-06-26 at 09.15.58.png)

以及在你的代码库中的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%的内容。