跳至主要內容

Prisma 入门

njrnodeprismaORM大约 5 分钟约 1449 字

以关系型数据库 Mysql 为例,介绍 Prisma 在 Node.js 和 Typescript 项目中的安装和使用。

前置条件

更多系统要求请参考 Prisma 系统要求open in new window

确保拥有 数据库连接 urlopen in new window

安装项目

创建项目目录:

mkdir hello-prisma
cd hello-prisma

初始化 Typescript 项目并安装 Prisma CLI:

npm init -y
npm install prisma typescript tsx @types/node --save-dev

这会创建 package.json 文件,并创建一个 Typescript 项目。

接下来,初始化 Typescript:

npx tsc --init

你现在可以通过 npx 运行 Prisma CLI:

npx prisma

接下来,你可以通过创建 Prisma Schemaopen in new window 文件来创建 Prisma ORM 项目:

npx prisma init

这个命令做了两件事:

  • 创建一个名为 prisma 的目录,其中包含一个名为 schema.prisma 的文件,该文件包含数据库连接变量和 schema 模型。
  • 在项目根目录中创建 .envopen in new window 文件,用于定义环境变量(例如数据库连接)。

连接数据库

为了连接数据库,你需要在 schema.prisma 文件中定义数据源:

prisma/schema.prisma

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

 


.env

DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb"

URL 格式取决于你使用的数据库。对于 MySQL,它看起来如下(大写的部分是你的特定连接细节的占位符):

mysql://USER:PASSWORD@HOST:PORT/DATABASE

这里是对每个组件的简要解释:

  • USER: 数据库用户名
  • PASSWORD: 数据库用户密码
  • PORT: 数据库服务器运行的端口(通常为 3306 用于 MySQL)
  • DATABASE: 数据库名称

Prisma Migrate

Prisma Migrateopen in new window 是 Prisma 的迁移工具,用于管理数据库 schema 的变更。

prisma/schema.prisma

model Post {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String   @db.VarChar(255)
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

model Profile {
  id     Int     @id @default(autoincrement())
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  posts   Post[]
  profile Profile?
}

为了将 schema 转换为数据库,你需要运行 Prisma Migrate:

npx prisma migrate --name init

这个命令会做两件事:

  • 创建一个 SQL 迁移文件。
  • 在数据库中执行对应的 SQL 迁移文件。

注意:默认情况下,运行 prisma migrate dev 后,会在引擎盖下调用 generate。 如果模式中定义了 prisma-client-js 生成器,它会检查 @prisma/client 是否已安装,如果缺少,则安装。

安装 Prisma Client

要开始使用 Prisma 客户端,需要安装 @prisma/client 软件包:

npm install @prisma/client

安装命令会调用 prisma generate,读取 Prisma schema 并生成适合你模型的 Prisma 客户端版本。

workflow
workflow

无论何时更新 Prisma schema,都必须使用 prisma migrate devprisma db push 更新数据库模式。这将使数据库模式与 Prisma 模式保持同步。这些命令还将重新生成 Prisma 客户端。

[!WARNING] > prisma db push 不会生成迁移文件,只会在数据库中执行对应的 SQL 语句。

因此如果你需要对数据库进行版本控制,需要更好的迁移记录和管理,请使用 prisma migrate dev

操作数据库

查询数据

现在已经生成了 Prisma Clientopen in new window,可以开始编写在数据库中读写数据的查询。

创建一个名为 index.ts 的新文件,并在其中添加以下代码:

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  // ... you will write your Prisma Client queries here
}

main()
  .then(async () => {
    await prisma.$disconnect()
  })
  .catch(async (e) => {
    console.error(e)
    await prisma.$disconnect()
    process.exit(1)
  })

以下是代码片段各部分的简要概述:

  • @prisma/client 节点模块导入 PrismaClient 构造函数
  • 实例化 PrismaClient
  • 定义名为 main 的异步函数,向数据库发送查询
  • 调用 main 函数
  • 脚本终止时关闭数据库连接

main 函数中,添加以下查询,从数据库中读取所有用户记录并打印结果:

async function main() {
  // ... you will write your Prisma Client queries here
  const allUsers = await prisma.user.findMany()
  console.log(allUsers)
}

运行脚本:

npx tsx index.ts

这将打印一个空数组,因为数据库中还没有用户记录:

[]

写入数据

findMany 查询只能从数据库中读取数据(尽管它仍然是空的)。接下来可以向 Post 表和 User 表中写入新记录。

调整 main 函数,向数据库发送创建查询:

async function main() {
  await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io',
      posts: {
        create: { title: 'Hello World' }
      },
      profile: {
        create: { bio: 'I like turtles' }
      }
    }
  })

  const allUsers = await prisma.user.findMany({
    include: {
      posts: true,
      profile: true
    }
  })
  console.dir(allUsers, { depth: null })
}

这段代码使用 嵌套写查询open in new window 创建了一条新的用户记录以及新的帖子和简介记录。用户记录分别通过 Post.author ↔ User.postsProfile.user ↔ User.profile 关系字段与其他两条记录创建 关系open in new window

请注意,您向 findMany 传递了 includeopen in new window 选项,该选项告诉 Prisma 客户端在返回的用户对象中包含 postsprofile 关系。

运行脚本:

npx tsx index.ts

这将打印一个包含新创建的用户的数组:

[
  {
    email: 'alice@prisma.io',
    id: 1,
    name: 'Alice',
    posts: [
      {
        content: null,
        createdAt: 2020-03-21T16:45:01.246Z,
        updatedAt: 2020-03-21T16:45:01.246Z,
        id: 1,
        published: false,
        title: 'Hello World',
        authorId: 1,
      }
    ],
    profile: {
      bio: 'I like turtles',
      id: 1,
      userId: 1,
    }
  }
]

这个 query 向 UserPost 表中写入了新记录:

User

idemailname
1alice@prisma.ioAlice

Post

idcreatedAtupdatedAttitlecontentpublishedauthorId
12020-03-21T16:45:01.246Z2020-03-21T16:45:01.246ZHello Worldnullfalse1

Profile

idbiouserId
1I like turtles1

提示

你可以通过 npx prisma studio 启动 Prisma Studio,查看数据库中的数据。

总结

通过以上步骤,你已经了解了如何使用 Prisma 在 Node.js 和 Typescript 项目中连接数据库、查询数据和写入数据,并使用 Prisma Studio 查看数据库中的数据。