Sequelize table без столбца 'id'
У меня есть следующее синусовое определение таблицы:
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
, которую она явно имеет?
Ответы
Ответ 1
Если вы не определяете 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
});
Ответ 2
Для составного первичного ключа вы должны добавить "primaryKey: true" ко всем столбцам части первичного ключа. Sequelize считает, что такие столбцы являются частью составного первичного ключа.
Ответ 3
Если вы хотите полностью отключить первичный ключ для таблицы, вы можете использовать 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');
Ответ 4
Если ваша модель не имеет столбца идентификатора, вы можете использовать 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
. Таким образом, одна и та же ссылка не будет отображаться несколько раз, и база данных не будет создавать скрытый идентификационный столбец напрасно.