使用 Prisma 连接到平凯数据库

平凯数据库是一个兼容 MySQL 的数据库。Prisma 是当前流行的 Node.js ORM 框架之一。

本文档将展示如何使用平凯数据库和 Prisma 来构造一个简单的 CRUD 应用程序。

  • 配置你的环境。
  • 使用 Prisma 连接到平凯数据库集群。
  • 构建并运行你的应用程序。你也可以参考示例代码片段,完成基本的 CRUD 操作。

前置需求

为了能够顺利完成本教程,你需要提前:

  • 在你的机器上安装 Node.js 16.x 或以上版本。
  • 在你的机器上安装 Git
  • 准备一个 TiDB 集群。

如果你还没有 TiDB 集群,可以按如下方式创建一个:

运行代码并连接到平凯数据库

本小节演示如何运行示例应用程序的代码,并连接到 TiDB。

第 1 步:克隆示例代码仓库到本地

运行以下命令,将示例代码仓库克隆到本地:

git clone https://github.com/tidb-samples/tidb-nodejs-prisma-quickstart.git cd tidb-nodejs-prisma-quickstart

第 2 步:安装依赖

运行以下命令,安装示例代码所需要的依赖 (包括 prisma 依赖包):

npm install

在你现有的项目当中,你可以通过以下命令安装所需要的依赖包:

npm install prisma typescript ts-node @types/node --save-dev

第 3 步:配置连接信息

  1. 运行以下命令,将 .env.example 复制并重命名为 .env

    cp .env.example .env
  2. 编辑 .env 文件,按照如下格式设置连接信息,将占位符 {} 替换为你的 TiDB 集群的连接参数值:

    DATABASE_URL='mysql://{user}:{password}@{host}:4000/test'

    如果你在本地运行 TiDB 集群,默认的 Host 是 127.0.0.1, 默认用户名为 root, 密码为空。

  3. 保存 .env 文件。

  4. prisma/schema.prisma 文件中,将 provider 修改为 mysql,并将 url 修改为 env("DATABASE_URL")

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

第 4 步:初始化表结构

运行以下命令,使用 Prisma Migrate 根据 prisma/schema.prisma 文件中的数据模型定义来初始化数据库表结构:

npx prisma migrate dev

prisma.schema 文件中的模型定义:

// 定义一个 Player 模型,表示 `players` 表。 model Player { id Int @id @default(autoincrement()) name String @unique(map: "uk_player_on_name") @db.VarChar(50) coins Decimal @default(0) goods Int @default(0) createdAt DateTime @default(now()) @map("created_at") profile Profile? @@map("players") } // 定义一个 Profile 模型,表示 `profiles` 表。 model Profile { playerId Int @id @map("player_id") biography String @db.Text // 定义 `Player` 和 `Profile` 模型之间的 1:1 关系,并使用外键约束。 player Player @relation(fields: [playerId], references: [id], onDelete: Cascade, map: "fk_profile_on_player_id") @@map("profiles") }

你可以通过查阅 Prisma 的 Data model 文档来了解如何在 prisma.schema 文件里定义数据模型。

预期执行结果:

Your database is now in sync with your schema. ✔ Generated Prisma Client (5.1.1 | library) to ./node_modules/@prisma/client in 54ms

这个命令同时会根据 prisma/schema.prisma 文件中的模型定义,生成用于与数据库交互的 Prisma Client 的代码。

第 5 步:运行代码并查看结果

运行下述命令,执行示例代码:

npm start

示例代码中的主要逻辑:

// 步骤 1. 导入自动生成的 `@prisma/client` 依赖包。 import {Player, PrismaClient} from '@prisma/client'; async function main(): Promise<void> { // 步骤 2. 创建一个新的 `PrismaClient` 实例。 const prisma = new PrismaClient(); try { // 步骤 3. 使用 Prisma Client 执行一些 CRUD 操作。 } finally { // 步骤 4. 断开 Prisma Client 的连接。 await prisma.$disconnect(); } } void main();

预期输出结果:

如果连接成功,在你的终端上会输出所连接集群的版本信息。

🔌 Connected to TiDB cluster! (TiDB version: 8.0.11-TiDB-v7.1.8-5.1) 🆕 Created a new player with ID 1. ℹ️ Got Player 1: Player { id: 1, coins: 100, goods: 100 } 🔢 Added 50 coins and 50 goods to player 1, now player 1 has 150 coins and 150 goods. 🚮 Player 1 has been deleted.

示例代码片段

你可参考以下关键代码片段,完成自己的应用开发。

完整代码及其运行方式,见代码仓库 tidb-samples/tidb-nodejs-prisma-quickstart。

插入数据

下面的查询会创建一条新的 Player 记录,并返回一个包含自增 ID 的 Player 对象:

const player: Player = await prisma.player.create({ data: { name: 'Alice', coins: 100, goods: 200, createdAt: new Date(), } }); console.log(player.id);

更多信息参考插入数据

查询数据

下面的查询会返回 ID 为 101Player 记录,如果没有找到对应的记录,会返回 null

const player: Player | null = prisma.player.findUnique({ where: { id: 101, } });

更多信息参考查询数据

更新数据

下面的查询会将 ID 为 101Player 记录的 coinsgoods 字段的值分别增加 50:

await prisma.player.update({ where: { id: 101, }, data: { coins: { increment: 50, }, goods: { increment: 50, }, } });

更多信息参考更新数据

删除数据

下面的查询会删除 ID 为 101Player 记录:

await prisma.player.delete({ where: { id: 101, } });

更多信息参考删除数据

注意事项

外键约束与 Prisma Relation Mode

你可以使用外键约束或 Prisma Relation Mode 来检查参照完整性

  • 外键是从 v6.6.0 开始支持的,在 v7.1.8 成为正式功能。外键允许跨表交叉引用相关数据,外键约束则可以保证相关数据的一致性。

  • Prisma Relation Mode 是 Prisma Client 端对外键约束的模拟。该特性会对应用程序的性能产生一些影响,因为它需要额外的数据库查询来维护参照完整性。

下一步