想在某个开发项目中成功的用prisma在Git版本控制中包含触发功能,所以介绍一下自己实践的方法。

在迁移历史中包含触发功能,开发将是?

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 目录。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

关于连接supabase的细节我就不赘述了,在.env和.env.local等文件中写下如下内容。

用您自己的超级基础信息替换每个项目。

.env
DATABASE_URL=xxx
SUPABASE_URL=xxx
SUPABASE_KEY=xxx

Prisma 模式定义

在 prisma 目录中的 shema.prisma 文件中定义模型。

这是一个简单的例子:

棱镜/shema.棱镜
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) 的文件,如下所示。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

启动 PrismaStudio 并检查表格。

npx prisma studio

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

一张桌子准备好了。

如果您从 superbase 仪表板检查,它的创建方式如下。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

实现 post 函数作为示例

我正在尝试添加发布功能。

直接在 pages/api 下创建一个 posts.ts 文件,并将其用作创建帖子的端点。

页面/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文件如下。

页面/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 启动服务器并检查它。

很难看,但是表格已经设置好了。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

作为测试,输入TITLE 1 并发送。

希望您会看到在控制台中创建的帖子。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

我还将检查 Prisma Studio。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

在迁移历史记录中包含触发函数

现在让我们创建我们的触发器函数。

这次作为一个示例,当一条新记录被插入(INSERT)到 post 表中时,我们将使用它作为触发器将一条记录也插入到通知表中。

由于shema.prisma中没有描述触发功能,所以需要准备一个sql文件。

使用 prisma,只能按如下方式生成文件。

npx prisma migrate dev --create-only

会再次询问我的姓名,所以我暂时输入trigger_function

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

编辑 xxx_trigger_function 文件夹中的 migration.sql 文件。

棱镜/迁移/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 的函数。触发器的创建方式类似。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

让我们看看它是否按预期工作。

首先,在首页输入TITLE 2并发送。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

这像往常一样添加到帖子中。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

还要检查通知表以查看触发器功能是否正常工作。

PostgreSQL トリガー関数を Prisma + Supabase でうまく使う方法

我能够确认数据已正确注册在通知中。

这就是如何在 Prisma 和 Supabase 中使用触发函数的全部内容!


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308632746.html

相关文章:

  • 2021-06-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-28
  • 2021-10-25
猜你喜欢
  • 2022-01-15
  • 2021-11-06
  • 2023-03-08
  • 2021-04-27
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案