mysql 按在SequelizeJS中存储为二进制的UUID查找行

rxztt3cl  于 2023-02-03  发布在  Mysql
关注(0)|答案(2)|浏览(152)

我有一个名为Org的Sequelize对象,它表示存储在MySQL中的organizations表中的一行。(id)存储为16字节的varbinary。如果我有一个对象的UUID(bfaf 1440 -3086- 11 e3-b 965 - 22000 af 9141 e)作为一个字符串,在Sequelize的where子句中将其作为参数传递的正确方法是什么?
以下是我尝试过的选项
模型:(对于现有MySQL表)

var uuid = require('node-uuid');

module.exports = function(sequelize, Sequelize) {
  return sequelize.define('Org', {
    id: {
      type: Sequelize.BLOB, //changing this to Sequelize.UUID does not make any difference
      primaryKey: true,

      get: function() {
        if (this.getDataValue('id')) {
          return uuid.unparse(this.getDataValue('id'));
        }
      }
    },
    name: Sequelize.STRING,
  }, {
    tableName: 'organisation',
    timestamps: false,
    }
  });
};

选项1:使用node-uuid将UUID作为字节缓冲区传递

Org.find({
    where: {
    id: uuid.parse(orgId)
    }
}).then(function(org) {
    success(org);
}).catch(function(err) {
    next(err);
});

Executing (default): SELECT `id`, `name` FROM `Organisation` AS `Org`
    WHERE `Org`.`id` IN (191,175,20,64,48,134,17,227,185,101,34,0,10,249,20,30);

Sequelize将字节缓冲区视为多个值,因此我得到了多个匹配项,并返回了最上面的记录(不是具有正确UUID的记录)。
选项2:编写原始SQL查询并将UUID作为十六进制值传递

sequelize.query('SELECT * from organisation where id = x:id', Org, {plain: true}, {
      id: orgId.replace(/-/g, '')
}).then(function(org) {
    success(org);
}).catch(function(err) {
    next(err);
});

Executing (default): SELECT * from organisation 
    where id = x'bfaf1440308611e3b96522000af9141e'

我得到了正确的记录,但这种方法并不是很有用,因为我在DB中有更复杂的关系,而且手工编写太多的查询也超出了ORM的目的。
我使用的是Sequelize 2.0.0-rc 3。

qjp7pelc

qjp7pelc1#

通过向uuid.parse()提供一个固定大小的空Buffer对象解决了这个问题。
最初使用ByteBuffer使其工作,但后来意识到使用uuid.parse()也可以实现同样的效果

Org.find({
  where: {
    id: uuid.parse(orgId, new Buffer(16))
  }
}).then(function(org) {
  console.log('Something happened');
  console.log(org);
}).catch(function(err) {
  console.log(err);
});

Executing (default): SELECT `id`, `name` FROM `Organisation` AS `Org` 
   WHERE `Org`.`id`=X'bfaf1440308611e3b96522000af9141e';
vybvopom

vybvopom2#

如果公认的答案对你不起作用,下面是对我起作用的答案。
注意:我的目标是基于不是主键的列查找事件的示例。

// guard clause
if (!uuid.validate(uuid_code))
  return
 
const _event = await event.findOne({ where: { uuid_secret: uuid_code } })
  
// yet another guard clause
if (_event === null)
  return
  
// your code here

相关问题