如何在 prisma 管理的 postgresql 数据库上创建触发器?

Gou*_*ack 5 postgresql triggers prisma

晚上好 。我正在使用nodejs、prisma、postgresql 开发一个聊天应用程序。我希望在特定聊天中创建最后一条消息后 24 小时内立即从 postgresql 数据库中删除。为此,我创建了一个触发器:

--function creation

create or replace function chat_expired() returns trigger as $delete_account$
begin 
delete from chat where current_timestamp - last.messages.createAt = 24*60*60;
return new;
end;
$delete_account$ language plpgsql ;

-- trigger creation

create trigger messages_added
after update 
on chat --I get error on this line
for each row 
execute procedure chat_expired();
Run Code Online (Sandbox Code Playgroud)

来自 postgresql 查询工具,但是当我执行时,我收到错误 cat 关系在触发器定义级别不存在。我猜是因为我的查询工具空间中还没有定义聊天表;但我没有设置它,因为聊天表已经从 prisma Immigration 创建。因此,我删除了 prisma 迁移的文件夹,然后创建了一个新的迁移,并.sql手动修改了该文件,以便将触发器插入其中,从而认为 prisma 也会在与数据库表同时为我创建触发器:--函数创建

create or replace function "chat_expired"() returns trigger as $delete_account$
begin 
delete from "Chat" where current_timestamp - last.chatMessage.createdAt = 3*60;
return new;
end;
$delete_account$ language plpgsql ;

-- trigger creation

create trigger "messages_added"
after update 
on "chat" 
for each row 
execute procedure "chat_expired"();
Run Code Online (Sandbox Code Playgroud)

注意:前面的代码比第一个代码多了一些引号。但它反而阻止了迁移的应用,我收到了错误

Error: P3006

Migration `20220905231003_initial_migration` failed to apply cleanly to the shadow database. 
Error code: P1014
Error:
The underlying table for model `(not available)` does not exist.
Run Code Online (Sandbox Code Playgroud)

仅在我删除手动添加的行后才解决。所以我不知道如何在 prisma 管理的 postgresql 数据库上创建触发器。我已经思考解决方案好几个星期了。我什至看过这个stackoverflow 问题,也看过这个问题,但什么也没有。谢谢 !

小智 6

Prisma 尚不支持触发器。Prisma 有一篇关于这个主题的优秀文章。他们建议编写Prisma 中间件来实现“触发器”。还有一个针对它的功能请求