【问题标题】:Custom data type not getting assigned values for record creation自定义数据类型没有为记录创建分配值
【发布时间】: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


【解决方案1】:

对于一对一(主/外键关系),请查看 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2017-05-06
    相关资源
    最近更新 更多