Node.js 中的ORM 框架:prisma

使用 Prisma 你可以快速把ORM 添加到你的应用中,并对对数据进行建模、运行架构迁移、查询更新数据库。

快速开始

这里使用本地 SQLite 数据库

创建 TypeScript 项目并设置 Prisma ORM

第一步,创建一个项目目录并导航到其中:

mkdir hello-prisma
cd hello-prisma

接下来,使用 npm 初始化 TypeScript 项目:

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

这会创建一个 package.json,并为你的 TypeScript 应用进行初始设置。

现在,初始化 TypeScript:

npx tsc --init

然后,在项目中安装 Prisma CLI 作为开发依赖:

npm install prisma --save-dev

最后,使用 Prisma CLI 的 init 命令设置 Prisma ORM:

npx prisma init --datasource-provider sqlite

这将创建一个带有 schema.prisma 文件的新 prisma 目录,并将 SQLite 配置为你的数据库。你现在已准备好对数据进行建模并使用一些表创建数据库。

2. 在 Prisma 架构中对数据进行建模

¥ Model your data in the Prisma schema

Prisma 模式提供了一种直观的数据建模方法。将以下模型添加到你的 schema.prisma 文件中:

prisma/schema.prisma

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

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}

Prisma 模式中的模型有两个主要用途:

  • 代表底层数据库中的表

  • 作为生成的 Prisma 客户端 API 的基础

在下一部分中,你将使用 Prisma Migrate 将这些模型映射到数据库表。

3. 使用 Prisma Migrate 运行迁移以创建数据库表

此时,你已经有了 Prisma 架构,但还没有数据库。在终端中运行以下命令来创建 SQLite 数据库以及模型代表的 User 和 Post 表:

npx prisma migrate dev --name init

该命令做了三件事:

  1. 它在 prisma/migrations 目录中为此迁移创建了一个新的 SQL 迁移文件。

  2. 它针对数据库执行 SQL 迁移文件。

  3. 它在后台运行 prisma generate(安装了 @prisma/client 软件包并根据你的模型生成了定制的 Prisma 客户端 API)。

由于 SQLite 数据库文件之前不存在,因此该命令还在 prisma 目录中创建了它,名称为 dev.db,通过 .env 文件中的环境变量定义。

恭喜,你现在已准备好数据库和表。让我们来学习如何发送一些查询来读取和写入数据!

4. 探索如何使用 Prisma 客户端将查询发送到数据库

要将查询发送到数据库,你将需要一个 TypeScript 文件来执行 Prisma 客户端查询。为此创建一个名为 script.ts 的新文件:

touch script.ts

然后,将以下样板粘贴到其中:

script.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)
  })

此代码包含在脚本末尾调用的 main 函数。它还实例化 PrismaClient,它代表数据库的查询接口。

4.1.创建新的 User 记录

让我们从一个小查询开始,在数据库中创建一个新的 User 记录并将结果对象记录到控制台。将以下代码添加到你的 script.ts 文件中:

script.ts

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const user = await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io',
    },
  })
  console.log(user)
}

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

你无需复制代码,只需在编辑器中输入代码即可体验 Prisma Client 提供的自动补齐功能。你还可以通过按键盘上的 CTRL+SPACE 键主动调用自动补齐功能。

接下来,使用以下命令执行脚本:

npx ts-node script.ts

Show CLI results

{ id: 1, email: 'alice@prisma.io', name: 'Alice' }

干得好,你刚刚使用 Prisma 客户端创建了你的第一个数据库记录!🎉

在下一节中,你将学习如何从数据库读取数据。

4.2.检索所有 User 条记录

Prisma 客户端提供各种查询来从数据库读取数据。在本部分中,你将使用 findMany 查询返回数据库中给定模型的所有记录。

删除之前的 Prisma Client 查询并添加新的 findMany 查询:

script.ts

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const users = await prisma.user.findMany()
  console.log(users)
}

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

再次执行脚本:

npx ts-node script.ts

Show CLI results

[{ id: 1, email: 'alice@prisma.io', name: 'Alice' }]

请注意,单个 User 对象现在如何在控制台中用方括号括起来。这是因为 findMany 返回了一个数组,里面有一个对象。

4.3.使用 Prisma 客户端探索关系查询

Prisma 客户端的主要功能之一是易于使用 relations。在本部分中,你将了解如何在嵌套写入查询中创建 User 和 Post 记录。然后,你将看到如何使用 include 选项从数据库中检索关系。

首先,调整脚本以包含嵌套查询:

script.ts

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const user = await prisma.user.create({
    data: {
      name: 'Bob',
      email: 'bob@prisma.io',
      posts: {
        create: [
          {
            title: 'Hello World',
            published: true
          },
          {
            title: 'My second post',
            content: 'This is still a draft'
          }
        ],
      },
    },
  })
  console.log(user)
}

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

通过再次执行脚本来运行查询:

npx ts-node script.ts

Show CLI results

{ id: 2, email: 'bob@prisma.io', name: 'Bob' }

默认情况下,Prisma 客户端仅返回查询结果对象中的标量字段。这就是为什么,即使你还为新的 User 记录创建了新的 Post 记录,控制台也只打印了一个具有三个标量字段的对象:idemail 和 name

为了还检索属于 User 的 Post 记录,你可以通过 posts 关系字段使用 include 选项:

script.ts

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const usersWithPosts = await prisma.user.findMany({
    include: {
      posts: true,
    },
  })
  console.dir(usersWithPosts, { depth: null })
}

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

再次运行脚本以查看嵌套读取查询的结果:

npx ts-node script.ts

Show CLI results

[
  { id: 1, email: 'alice@prisma.io', name: 'Alice', posts: [] },
  {
    id: 2,
    email: 'bob@prisma.io',
    name: 'Bob',
    posts: [
      {
        id: 1,
        title: 'Hello World',
        content: null,
        published: true,
        authorId: 2
      },
      {
        id: 2,
        title: 'My second post',
        content: 'This is still a draft',
        published: false,
        authorId: 2
      }
    ]
  }
]

这次,你将看到两个 User 对象被打印。它们都有一个 posts 字段(对于 "Alice" 为空,对于 "Bob" 填充有单个 Post 对象),表示与它们关联的 Post 记录。

请注意,usersWithPosts 数组中的对象也是完全类型化的。这意味着你将获得自动补全功能,并且 TypeScript 编译器将防止你意外键入它们。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值