ค้นหาเว็บไซต์

sql - พารามิเตอร์ Bytea ในคำสั่ง prisma แบบดิบ


ฉันกำลังใช้ Typescript + Prisma + Postgres และฉันกำลังเจอปัญหาในการส่งพารามิเตอร์ bytea/Buffer ไปยังคำสั่ง query ดิบ

สมมติว่าฉันมีสคีมา DB ดังต่อไปนี้

model Item {
  id       BigInt @id @default(autoincrement()) @db.BigInt
  hash     Bytes  @unique
...
}

ฉันสามารถค้นหาไอเท็มตามแฮชของพวกมันโดยใช้คำสั่งค้นหาง่ายๆ แบบนี้ได้โดยไม่มีปัญหา

const itemHexHashes = ['ca6854726b0139254b7e5c4831c87ac043a938fa3543b5eb0ce0906e124483e9', ...]
const itemBufferHashes = itemHexHashes.map((h) => (Buffer.from(h, 'hex')))
const itemIds = await prisma.item.findMany({
  where: {
    hash: {
      in: itemBufferHashes
    }
  },
  select: {
    id: true
  }
})

แต่ฉันหาแนวทางในการส่งพารามิเตอร์ Buffer โดยใช้ $queryRaw ไม่เจอ (คำสั่ง query จริงซับซ้อนกว่านี้) เพราะวิธีต่อไปนี้ใช้ไม่ได้

const itemIds = await prisma.$queryRaw`
  SELECT id
  FROM "Item"
  WHERE hash IN (${Prisma.join(itemBufferHashes)})
`

เมื่อฉันตรวจสอบบันทึกของ Postgres คำสั่งแรกจะตีความแฮชได้ถูกต้องเป็น

parameters: $1 = '\xca6854726b0139254b7e5c4831c87ac043a938fa3543b5eb0ce0906e124483e9'

แต่คำสั่งค้นหาดิบทำอะไรแปลก ๆ และแยกวิเคราะห์พารามิเตอร์เป็น

parameters: $1 = '\x7b2274797065223a22427566666572222c2264617461223a5b3230322c3130342c38342c3131342c3130372c312c35372c33372c37352c3132362c39322c37322c34392c3230302c3132322c3139322c36372c3136392c35362c3235302c35332c36372c3138312c3233352c31322c3232342c3134342c3131302c31382c36382c3133312c3233335d7d'

ฉันลองหลายวิธี เช่น แทนที่จะใช้ hash IN (...) ก็ลองใช้ hash=ANY(...) หรือพยายามส่งรายการสตริงในคำสั่งค้นหา - สิ่งที่ใกล้เคียงกับค่าจริงของ hash มากที่สุดคือเมื่อฉันแปลง Buffers กลับเป็นสตริงโดยใช้การเข้ารหัส ascii คือ

const itemHashes = itemBufferHashes.map((buffer) => (buffer.toString('ascii')))

จากนั้นพารามิเตอร์ที่ใช้คือ

parameters: $1 = '\x4a6854726b0139254b7e5c4831487a404329387a3543356b0c60106e12440369'

ซึ่งเกือบจะเหมือนกับอันที่ถูกต้อง

parameters: $1 = '\xca6854726b0139254b7e5c4831c87ac043a938fa3543b5eb0ce0906e124483e9'

แต่สิ่งที่ฉันสังเกตคือทุกไบต์ที่สองไม่ถูกต้อง ถ้าค่าของมันมากกว่า 8 จะถูกลบออก 8

เกิดอะไรขึ้นเนี่ย?