sql - Bytea-parametri prisman raakakyselyssä
Käytän Typescriptiä + Prismaa + Postgrestä ja minulla on ongelmia bytea-/Buffer-parametrien välittämisessä raakakyselyihin.
Sanotaan, että minulla on seuraava tietokantakaavio
model Item {
id BigInt @id @default(autoincrement()) @db.BigInt
hash Bytes @unique
...
}
Voin kysellä kohteita niiden tiivisteiden perusteella käyttämällä yksinkertaista kyselyä kuten tämä ilman ongelmia
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
}
})
mutta en löydä tapaa välittää Buffer-parametreja käyttämällä $queryRaw (itse kysely on monimutkaisempi), koska seuraava ei yksinkertaisesti toimi
const itemIds = await prisma.$queryRaw`
SELECT id
FROM "Item"
WHERE hash IN (${Prisma.join(itemBufferHashes)})
`
Kun tarkastelen Postgres-lokeja, ensimmäinen kysely tulkitsee hajautuksen oikein seuraavasti
parameters: $1 = '\xca6854726b0139254b7e5c4831c87ac043a938fa3543b5eb0ce0906e124483e9'
mutta raakakysely tekee jotain outoa ja jäsentää parametrin seuraavasti
parameters: $1 = '\x7b2274797065223a22427566666572222c2264617461223a5b3230322c3130342c38342c3131342c3130372c312c35372c33372c37352c3132362c39322c37322c34392c3230302c3132322c3139322c36372c3136392c35362c3235302c35332c36372c3138312c3233352c31322c3232342c3134342c3131302c31382c36382c3133312c3233335d7d'
Yritin useita asioita, esim. hash IN (...) sijaan tehdä hash=ANY(...), tai yrittää lähettää merkkijonojen listan kyselyssä - lähimpänä hashin todellista arvoa pääsin, kun muutin Buffersit takaisin merkkijonoksi käyttäen ascii-koodausta, eli
const itemHashes = itemBufferHashes.map((buffer) => (buffer.toString('ascii')))
sitten käytetty parametri oli
parameters: $1 = '\x4a6854726b0139254b7e5c4831487a404329387a3543356b0c60106e12440369'
joka on melkein sama kuin oikea
parameters: $1 = '\xca6854726b0139254b7e5c4831c87ac043a938fa3543b5eb0ce0906e124483e9'
mutta huomasin, että jokainen toinen tavu on väärin, jos sen arvo on suurempi kuin 8, niin siitä vähennetään 8...
Mitä helvettiä on meneillään?