如何解决如何将 MySQL binary(16) 中的 uuid 与 Nodejs 中的 Bigquery BYTES 进行比较
我有一个基于 MySQL 的数据库,其中 UUID 存储为 Binary(16) 和 Bigquery SQL 数据库,其中相同的 UUID 存储为 BYTES。我尝试设置这种方式来节省两个数据库的空间,但结果是有点噩梦。
我使用 Prisma ORM 来检索 UUID,它返回一个带有 UUID 字符串的缓冲区类型,然后我需要在 Bigquery 上查询该 UUID。我设法这样做的唯一方法是将 Bigquery 上的 BYTES 字段和从 MySQL 返回的 Buffer 转换为十六进制字符串并将它们放在一起进行比较。但是,如果我要比较十六进制字符串中的 UUID,为什么还要将它们保留在二进制字段中呢?有没有办法在不进行转换的情况下比较二进制文件?
const { BigQuery } = require('@google-cloud/bigquery')
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
const dataset = process.env.DB_DATASET
const tableClients = `(
SELECT *,EXTRACT(DATE FROM insertion_time) ptt,ROW_NUMBER() OVER (PARTITION BY uuid ORDER BY insertion_time desc) rn
FROM \`${dataset}.clients\` WHERE insertion_time <= CURRENT_DATE() AND TO_HEX(parent_company_uuid) = @parent_company
) clients`
const projectId = 'my-project'
const keyFilename = process.env.GOOGLE_APPLICATION_CREDENTIALS
const bigqueryClient = new BigQuery({
projectId,keyFilename,})
const TestService = {
async test() {
const company = await prisma.company.findFirst()
const query = `SELECT * FROM ${tableClients} WHERE rn = 1 AND DATE(insertion_time) <= CURRENT_DATE()`
const params = { parent_company: company.uuid.toString('hex') }
const options = {
query: `${query};`,params,}
const [result] = await bigqueryClient.query(options)
return result
},}
module.exports = TestService
tableClients
的事情是因为我没有更新数据库(Bigquery 讨厌这样做),而是使用新的 insertion_time
插入相同的记录,基于此字段创建一个分区,并获取最近的记录(row_number = 1)。另外,我在那里过滤了公司 uuid。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。