PrismaのRawQueryでのBoolean値の扱いについて
JSのORMの1つであるPrismaでRawQueryを使用する時にBooleanの扱いで詰まった時のメモ
詰まったこと
PrismaでDBからBooleanを取得しようとした時、RawQueryを使用する時と使用しない時で返り値の形式に違いがあって困った。
Model経由で以下のように取得したデータにBoolean値が含まれている場合、 true / false
で取得することができる。
const result = await prisma.hoge.findUnique({
where: {
'id': 1
}
})
しかし、以下のようにRaw Queryを使用して取得した場合、 1 / 0
で取得される。
Raw Queryを使用することは少ないと思うが、複雑なクエリを実行したい時などにModel経由とRaw Queryでデータ型が異なって取得されるのは不便に感じた。
const result = await prisma.$queryRaw`SELECT * FROM Hoge WHERE id = 1;`
原因について
そもそも、MySQLのBooleanはTINYINTになっていて、内部では 1 / 0
で保持されている。
Prismaの公式ドキュメントでも
Note: The Prisma Client query engine standardizes the return type for all databases. Using the raw queries does not. If the database provider is MySQL, the values are 1 or 0. However, if the database provider is PostgreSQL, the values are true, false, or NULL.
このように書かれており、MySQLの場合は 1 / 0
で返すと書かれている。
それなら、Model経由した時も 1 / 0
で返してくれたらいいのに... 多分何か理由あるんだろうな...
暫定対応
Raw Queryの場合、Booleanは 1 / 0
で返ってくるのは仕方のないことのようなので、Modelを経由した時と同じように true / false
で返っているように見せるための方法として、
Raw Queryで 1 / 0
で取得したあと、 true / false
に変換してからレスポンスとして使用することにした。
// booleanをJSのBooleanに変換
const convertType = value => {
value['boolean'] = Boolean(value['boolean'])
return value
}
const result = await prisma.$queryRaw`SELECT * FROM Hoge WHERE id = 1;`
const returnData = convertType(result[0])
response.send(returnData)
これによって、Raw QueryでもMySQLのBooleanを true / false
で返すことができた🎉
Thanks!! 相談に乗ってくださった先輩方ありがとうございました。
Discussion