自定义数据类型未获得记录创建的分配值
Custom data type not getting assigned values for record creation
我通过扩展 Abstract 编写了一个自定义数据类型,就像下面为 link 列出的示例:https://sequelize.org/v5/manual/data-types.html。在我尝试保存外键之前,一切似乎都正常,在这种情况下,它会继续生成一个新的 UUID,而不是将对象中的外键传递给创建方法。
在这种情况下我应该如何容纳外键?我应该重载哪个方法调用来处理需要传入值的 getter 情况?
下面的代码概述了我正在使用的扩展 class
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
});
以下是 table 的关联:
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
}]
});
我只是想将外键保存到此 table。当我查看用户和组的数据库 tables 时,这些值与 uuid 主键值不匹配。似乎 BinToUUID 数据类型正在覆盖传递给创建方法的 UUID。
对于一对一(primary/foreign 键关系),查看 belongsTo / HasOne 关联
属于
https://sequelize.org/v5/class/lib/model.js~Model.html#static-method-belongsTo
其中有以下示例:
Profile.belongsTo(User) // This will add userId to the profile table
有一个
https://sequelize.org/v5/class/lib/associations/has-one.js~HasOne.html:
This is almost the same as belongsTo with one exception - The foreign key will be defined on the target model.
有关示例,请参阅本教程:https://sequelize.org/v4/manual/tutorial/associations.html
这篇(非官方的?)文章展示了如何处理外键:https://medium.com/@edtimmer/sequelize-associations-basics-bde90c0deeaa
我通过扩展 Abstract 编写了一个自定义数据类型,就像下面为 link 列出的示例:https://sequelize.org/v5/manual/data-types.html。在我尝试保存外键之前,一切似乎都正常,在这种情况下,它会继续生成一个新的 UUID,而不是将对象中的外键传递给创建方法。
在这种情况下我应该如何容纳外键?我应该重载哪个方法调用来处理需要传入值的 getter 情况?
下面的代码概述了我正在使用的扩展 class
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
});
以下是 table 的关联:
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
}]
});
我只是想将外键保存到此 table。当我查看用户和组的数据库 tables 时,这些值与 uuid 主键值不匹配。似乎 BinToUUID 数据类型正在覆盖传递给创建方法的 UUID。
对于一对一(primary/foreign 键关系),查看 belongsTo / HasOne 关联
属于
https://sequelize.org/v5/class/lib/model.js~Model.html#static-method-belongsTo
其中有以下示例:
Profile.belongsTo(User) // This will add userId to the profile table
有一个
https://sequelize.org/v5/class/lib/associations/has-one.js~HasOne.html:
This is almost the same as belongsTo with one exception - The foreign key will be defined on the target model.
有关示例,请参阅本教程:https://sequelize.org/v4/manual/tutorial/associations.html
这篇(非官方的?)文章展示了如何处理外键:https://medium.com/@edtimmer/sequelize-associations-basics-bde90c0deeaa