【发布时间】:2021-12-19 21:49:36
【问题描述】:
我通过扩展 Abstract 编写了一个自定义数据类型,如以下链接中列出的示例:https://sequelize.org/v5/manual/data-types.html。在我尝试保存外键之前,一切似乎都正常工作,在这种情况下,它会继续生成新的 UUID,而不是将对象中的外键传递给 create 方法。
在这种情况下我应该如何容纳外键?我应该重载哪个方法调用来处理需要传入值的 getter 情况?
下面的代码概述了我正在使用的扩展类
class BinToUUID extends ABSTRACT {
toString(options) {
return this.toSql(options);
}
toSql() {
return 'BINARY(16)';
}
validate(value) {
console.log(value);
}
_stringify(value, options) {
return `UUID_TO_BIN(${options.escape(value)})`;
}
_bindParam(value, options) {
return `UUID_TO_BIN('${options.escape(value)}')`;
}
parse(value) {
return uuidv1.parse(value);
}
_sanitize(value) {
if (value instanceof Buffer) {
const str = value.toString('hex');
return [
str.slice(0, 8),
str.slice(8, 12),
str.slice(12, 16),
str.slice(16, 20),
str.slice(20, 32),
].join('-');
} else {
const uuid = uuidv1();
return uuid;
}
return value;
}
}
这是我使用的模型示例:
sequelize.define("room", {
roomId: {
primaryKey: true,
allowNull: false,
type: Sequelize.BinToUUID,
defaultValue: Sequelize.BinToUUID,
validate: {
notNull: true
}
},
name: {
type: DataTypes.STRING(10)
},
userId: {
type: Sequelize.BinToUUID,
references: {
model: 'user',
key: 'userId',
}
},
groupId: {
type: Sequelize.BinToUUID,
references: {
model: 'group',
key: 'groupId',
}
},
createdAt: {
type: DataTypes.DATE
},
updatedAt: {
type: DataTypes.DATE
}
}, {
freezeTableName: true
});
以下是表格的关联:
db.Room.User = db.Room.hasOne(db.User, {
foreignKey: ‘roomId'
});
db.Room.Group = db.Room.hasOne(db.Group, {
foreignKey: ‘groupId'
});
这是开始调用的创建方法来保存房间:
Room.create(room, {
include: [{
association: Room.User
}, {
association: Room.Group
}]
});
我只是想把外键保存到这个表中。当我查看用户和组的数据库表时,这些值与 uuid 主键值不匹配。似乎 BinToUUID 数据类型正在覆盖传递给 create 方法的 UUID。
【问题讨论】:
-
正在生成什么 SQL?
-
INSERT INTO
room(roomId,name,userId,groupId,createdAt,updatedAt) 值 (UUID_TO_BIN('ff0ffa-a24-a371-498-a24-a33-98 -ed19a0ef72c3'),?,UUID_TO_BIN('ff0ffa25-7371-4988-a5a5-ed19a0ef72c3'),UUID_TO_BIN('ff0ffa31-7371-4988-a5a5-ed19a0ef72c3'),?,?); -
什么生成了
'ff0ffa24-7371-4988-a5a5-ed19a0ef72c3'?
标签: mysql node.js sequelize.js