序列化没有列“id”的表

问题描述 投票:0回答:5

我有以下表的续集定义:

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
});

如您所见,此表中没有

id
列。但是,当我尝试插入它时,它仍然尝试以下 sql:

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

如何禁用它明显具有的

id
功能?

javascript mysql node.js sequelize.js
5个回答
171
投票

如果您没有定义

primaryKey
,则续集默认使用
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
});

66
投票

如果要完全禁用表的主键,可以使用

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');

25
投票

如果您的模型没有 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');

注: 您似乎正在制作一个连接表。考虑设置

academy_id
module_id
主键。这样同一个链接就不会出现多次,数据库也不会白白创建一个隐藏的 id 列。


20
投票

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


0
投票

如果您使用sequelize cli 来生成模型。

    module.exports = (sequelize, DataTypes) => {
  class follow extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  }
  follow.init({
    follower_id: DataTypes.INTEGER,
    followee_id: DataTypes.INTEGER
  }, {
    sequelize,
    modelName: 'follows',
  });

  follow.removeAttribute("id");

  return follow;
};
© www.soinside.com 2019 - 2024. All rights reserved.