如何在Prisma中使用数据库原生NOW()函数执行表更新操作?
如何在不使用API服务器时间的前提下调用数据库原生函数
你给出的设置finishedAt字段的代码已经是正确实现,Prisma中调用数据库原生函数的标准方案就是使用prisma.raw()方法,该方法会将你传入的SQL表达式直接提交给数据库执行,不会在API服务层做任何处理,完全可以满足你使用数据库侧时间的需求。
不同数据库的时间函数参考
- MySQL 可用:
NOW()、CURRENT_TIMESTAMP、UTC_TIMESTAMP() - PostgreSQL 可用:
NOW()、CURRENT_TIMESTAMP、transaction_timestamp() - SQLite 可用:
DATETIME('now')
注意事项
prisma.raw()传入的SQL片段默认不会做防注入处理,禁止将用户可控的输入直接拼接进prisma.raw()的参数,如果需要传入动态参数请使用参数化传参写法,示例如下:
// 带动态参数的raw写法,可避免SQL注入风险 ctx.prisma.raw('UPDATE table SET count = count + ? WHERE id = ?', [addNum, targetId])
- 除了时间函数外,所有数据库支持的原生运算、自定义函数都可以通过
prisma.raw()调用,比如库存扣减场景的示例:
await ctx.prisma.goods.update({ data: { // 直接在数据库侧执行库存扣减运算,避免并发场景下的脏写问题 stock: ctx.prisma.raw('stock - 1') }, where: { id: goodsId } })
内容的提问来源于stack exchange,提问作者Henrique
相关产品推荐
相关产品推荐

