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 编译器将防止你意外键入它们。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值