2015-03-24 2 views
21

У меня есть следующее определение sequelize таблицы:sequelize таблицы без столбца «идентификатор»

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 это явно имеет?

ответ

32

Если вы не указали primaryKey, то по умолчанию sseelize использует 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 
}); 
+1

Что делать, если module_id и academy_id являются primaryKey? –

+0

В таблице может быть только один первичный ключ, если только вы не создадите составной первичный ключ. Я не уверен, поддерживает ли Sequelize это. –

+8

Не обращайте внимания на вышеизложенное, Sequelize поддерживает это. Просто добавьте 'primaryKey: true' в столбцы, которые вы хотите использовать в качестве первичного ключа. –

9

Для составного первичного ключа вы должны добавить «primaryKey: true» ко всем столбцам части первичного ключа. Sequelize считает, что такие столбцы являются частью составного первичного ключа.

+0

Как деблокировать первичный ключ custome с помощью sequelize-cli, как что-то вроде этой модели sequelize: create --name MyUsera --attributes first_name: Integer: primaryKey: true, last_name: string, bio: text –

5

Если вы хотите полностью отключить первичный ключ для таблицы, вы можете использовать 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'); 
1

Если ваша модель не имеет колонки 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 первичные ключи. Таким образом, одна и та же ссылка не будет отображаться несколько раз, и база данных не создаст скрытый идентификационный столбец напрасно.

Смежные вопросы