postgresql 在prisma中从不同的表中选择数据时创建一条记录,并且两者与父表具有相同的关系

omvjsjqw  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(155)

就是这张table

model wallet {
  id             Int  @id @default(autoincrement())
  userId         Int  @unique
  balance        Int  @default(0)
  joining_bonus  Int  @default(0)
  referral_bonus Int  @default(0)
  incentive      Int  @default(0)
  user           user @relation(fields: [userId], references: [id])
}

model transaction {
  id               Int                @id @default(autoincrement())
  userId           Int
  type             String
  amount           Int
  curBalance       Int
  payment_gateway String
  payment_id      String
  status           transaction_status @default(PENDING)
  timestamp        DateTime           @default(now())
  user             user               @relation(fields: [userId], references: [id])
 
}

我想执行这个查询

const transaction = await prisma.transaction.create({
    data: {
        amount: amount,
        type: type,
        payment_gateway: payment_gateway,
        payment_id: payment_id,
        curBalance: {
            //get data from wallet table and select balance field
        },
        user: {
            connect: {
                id: parseInt(req.user.id)
            }
        }
        
    }
});

我想在创建交易记录的同时从钱包表中获取数据,因为如果我在不同的查询中这样做,由于异步调用,可能会有时间差,我可以获得不同的当前余额值。
如果这个查询是可能的,告诉我如何或如果不是如何做到这一点,所以我可以总是最新的数据。

sqougxex

sqougxex1#

Prisma目前不支持子选择或从另一个表中获取数据,同时以您尝试实现的方式创建记录。
为了实现这一点,您将需要使用事务来确保这些操作以原子方式并以正确的顺序发生。您将首先获取用户的当前余额,然后在创建事务记录时使用该数据。
您可以使用数据库事务,在阅读事务中的余额值时,可以使用数据库级别的锁(如SELECT FOR UPDATE)来防止它在事务完成时更新。
下面是一个例子,它可能看起来像:

const userId = parseInt(req.user.id);

// Start a transaction
const result = await prisma.$transaction(async (prisma) => {
  // Lock the row
  const wallet = await prisma.$queryRaw`SELECT * FROM "wallet" WHERE "userId" = ${userId} FOR UPDATE`;

  // Perform your updates...
  const transaction = await prisma.transaction.create({
    data: {
      amount: amount,
      type: type,
      payment_gateway: payment_gateway,
      payment_id: payment_id,
      curBalance: wallet.balance,
      user: {
        connect: {
          id: userId,
        },
      },
    },
  });

  // Return the results
  return transaction;
});

相关问题