Prisma ORM
在 Midway Hooks 中,我们推荐使用 Prisma 来构建数据库,并实现我们静态类型安全的目标。
Prsima 是面向 Node.js & TypeScript 设计的 ORM,它提供了一系列友好的功能(Schema 定义、客户端生成、完全的 TypeScript 支持),可以帮助用户快速构建应用。
Example
我们提供了一个简单的例子 hooks-prisma-starter,来演示在 Midway Hooks 如何使用 Prisma。
下面我也会简单介绍,Midway Hooks 配合 Prisma 开发应用会有多么的简单。
数据库 Schema
例子基于 sqlite,数据库 Schema 如下:
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String
content String?
published Boolean @default(false)
viewCount Int @default(0)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
具体的数据库设置 & 初始数据填充工作,参考 hooks-prisma-starter 文档即可。
初始化 Prisma
在项目的 src/api 下新建 prisma 文件,使用如下代码即可初始化 Client。
import { PrismaClient } from '@prisma/client';
export const prisma =
new PrismaClient();
使用代理镜像
Prisma 在安装时会根据平台动态下载可执行文件,如果你的网络环境不好,可以通过环境变量来设置镜像。
PRISMA_ENGINES_MIRROR=https://registry.npmmirror.com/-/binary/prisma/
相关 Issue: mirror prisma
查询数据
以获取所有发布的文章为例,你可以通过生成的 Prisma Client 快速完成操作。
后端代码:
import {
Api,
Get,
} from '@midwayjs/hooks';
import { prisma } from './prisma';
export default Api(Get(), async () => {
const posts =
await prisma.post.findMany({
where: { published: true },
include: { author: true },
});
return posts;
});
一体化调用:
import fetchFeeds from '../api/feeds';
fetchFeeds().then((feeds) => {
console.log(feeds);
});
增加数据
以注册登录为例,基于一体化调用 + Prisma 生成的客户端,可以在简单的几行代码中完成所有的工作。
包含:
- 前端类型提示
- 后端参数校验
- 数据库操作
import {
Api,
Post,
Validate,
} from '@midwayjs/hooks';
import { z } from 'zod';
import { prisma } from './prisma';
export const signUp = Api(
Post(),
Validate(
z.string(),
z.string().email()
),
async (
name: string,
email: string
) => {
const result =
await prisma.user.create({
data: {
name,
email,
},
});
return result;
}
);
一体化调用:
import { signUp } from '../api/feeds';
signUp('John', '[email protected]').then(
(user) => {
console.log(user);
}
);
更多示例
关于 Prisma 的更多示例,可以参考 Prisma 官网文档。