sequelize table 没有专栏 'id'

sequelize table without column 'id'

我有以下 table 的续集定义:

AcademyModule = sequelize.define('academy_module', {
        academy_id: DataTypes.INTEGER,
        module_id: DataTypes.INTEGER,
        module_module_type_id: DataTypes.INTEGER,
        sort_number: DataTypes.INTEGER,
        requirements_id: DataTypes.INTEGER
    }, {
        freezeTableName: true
});

如您所见,此 table 中没有 id 列。但是,当我尝试插入时,它仍然会尝试以下 sql:

 INSERT INTO `academy_module` (`id`,`academy_id`,`module_id`,`sort_number`) VALUES (DEFAULT,'3',5,1);

如何禁用它明明具有的id功能?

如果您不定义 primaryKey,sequelize 默认使用 id

如果您想自己设置,只需在您的列上使用 primaryKey: true

AcademyModule = sequelize.define('academy_module', {
    academy_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});

对于复合主键,您应该将 "primaryKey: true" 添加到主键的所有列部分。 Sequelize 将此类列视为复合主键的一部分。

如果要完全禁用 table 的主键,可以使用 Model.removeAttribute。请注意,这可能会在未来引起问题,因为 Sequelize 是一个 ORM,并且连接需要额外的设置。

const AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');

如果您的模型没有 ID 列,您可以使用 Model.removeAttribute('id');摆脱它。

http://docs.sequelizejs.com/en/latest/docs/legacy/

所以在你的情况下会是

AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');

注: 您似乎正在加入 table。考虑制作 academy_id module_id 主键。这样同一个link就不会出现多次,数据库也不会白白创建一个隐藏id列。

在此解决方案中,sequelize 添加了带有列名 id 的默认主键。 使用您自己定义的主键添加 primaryKey: true

AcademyModule = sequelize.define('academy_module', {
    academy_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});