想在某个开发项目中成功的用prisma在Git版本控制中包含触发功能,所以介绍一下自己实践的方法。
- 我在推特上,所以请检查一下 →推特@takuxone
- 我们还提供编程课程 →课程列表
在迁移历史中包含触发功能,开发将是?
Supabase 允许您在仪表板上配置 PostgreSQL 函数和触发器。
很方便,但是如果你是在Git/Github等上开发,不做任何事情就很不方便,而且不会出现在源代码中。
例如,如果您有单独的数据库用于开发和生产,则必须手动设置两者,
如果您经常重置数据库,例如为了开发,这尤其困难。
Prisma 是一个方便的 ORM 服务。
迁移也是可能的,因此数据库模式(模型)定义在每次更改时都将保留为 SQL 文件。
如果您在项目中使用 Prisma,在此迁移历史记录中包含触发函数的 SQL 语句将使您能够顺利进行开发。
前提
- 这一次,我想在Next.js项目中使用它,但它不仅可以应用于Next.js。
- 至于DB,这次是Supabase,不过我觉得其他的DB没有问题。
- 我不会解释Supabase的初始设置,所以请google一下。
准备示例项目
由于 Next.js 是一个示例,我想使用 Create Next App 创建它。
npx create-next-app@latest --ts
安装棱镜。
yarn add -D prisma
yarn add @prisma/client
初始化棱镜。
npx prisma init
将在您的项目中创建一个 prisma 目录。
关于连接supabase的细节我就不赘述了,在.env和.env.local等文件中写下如下内容。
用您自己的超级基础信息替换每个项目。
DATABASE_URL=xxx
SUPABASE_URL=xxx
SUPABASE_KEY=xxx
Prisma 模式定义
在 prisma 目录中的 shema.prisma 文件中定义模型。
这是一个简单的例子:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model post {
id Int @id @default(autoincrement())
title String
}
model notification {
id Int @id @default(autoincrement())
title String
}
post表将用于发布,并且在执行触发函数时将插入通知表。
第一次迁移
让我们从这里的第一次迁移开始。
npx prisma migrate dev
系统会要求您输入迁移历史记录的名称(文件夹名称),但在此处输入 first_migration。不用打字就可以输入。
完成后,将创建一个迁移文件夹和一个包含 sql 语句 (migration.sql) 的文件,如下所示。
启动 PrismaStudio 并检查表格。
npx prisma studio
一张桌子准备好了。
如果您从 superbase 仪表板检查,它的创建方式如下。
实现 post 函数作为示例
我正在尝试添加发布功能。
直接在 pages/api 下创建一个 posts.ts 文件,并将其用作创建帖子的端点。
import { PrismaClient } from "@prisma/client";
import { NextApiRequest, NextApiResponse } from "next";
const prisma = new PrismaClient();
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
if (req.method === "POST") {
const post = await prisma.post.create({
data: {
title: req.body.postTitle,
},
});
if (!post) throw Error("not created");
res.status(200).json(post);
} else {
res.setHeader("Allow", "POST");
res.status(405).end("Method Not Allowed");
}
}
接下来在pages下直接制作index.tsx文件如下。
import type { NextPage } from "next";
const Home: NextPage = () => {
const handleSubmit: React.FormEventHandler<HTMLFormElement> = async (e) => {
e.preventDefault();
const response = await fetch("/api/posts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
postTitle: e.currentTarget.post_title.value,
}),
});
const createdPost = await response.json();
console.log(createdPost);
};
return (
<div>
<form onSubmit={handleSubmit}>
<input type="text" name="post_title" placeholder="post title" />
<button type="submit">Submit</button>
</form>
</div>
);
};
export default Home;
在这种状态下,用yarn dev 启动服务器并检查它。
很难看,但是表格已经设置好了。
作为测试,输入TITLE 1 并发送。
希望您会看到在控制台中创建的帖子。
我还将检查 Prisma Studio。
在迁移历史记录中包含触发函数
现在让我们创建我们的触发器函数。
这次作为一个示例,当一条新记录被插入(INSERT)到 post 表中时,我们将使用它作为触发器将一条记录也插入到通知表中。
由于shema.prisma中没有描述触发功能,所以需要准备一个sql文件。
使用 prisma,只能按如下方式生成文件。
npx prisma migrate dev --create-only
会再次询问我的姓名,所以我暂时输入trigger_function。
编辑 xxx_trigger_function 文件夹中的 migration.sql 文件。
create or replace function public.insert_notification()
returns trigger as $$
begin
insert into public.notification(title)
values (new.title || ' was created');
return new;
end;
$$ language plpgsql;
create trigger on_insert_post
after insert
on public.post
for each row
execute procedure public.insert_notification();
- 函数名称:insert_notification
- 触发器名称:on_insert_post
当一条新记录插入到 post 表中时,上面将触发,
同时在通知表中生成一条记录。
这时候,使用post记录的title字段的值,
让字符串[その挿入されるレコードのタイトル] + " was created"
这应该是通知记录的标题。
现在迁移以应用它。
npx prisma migrate dev
如果您检查 supabase,则会在 Database > Functions 中创建一个名为 insert_notification 的函数。触发器的创建方式类似。
让我们看看它是否按预期工作。
首先,在首页输入TITLE 2并发送。
这像往常一样添加到帖子中。
还要检查通知表以查看触发器功能是否正常工作。
我能够确认数据已正确注册在通知中。
这就是如何在 Prisma 和 Supabase 中使用触发函数的全部内容!
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308632746.html