Я пытаюсь создать модель базы данных с помощью sequelize, но у меня проблема с первичным ключом модели.
Я использую Postgres (v10) в контейнере докеров и sequalize (Node.js v10.1.0 ) для моделей и GraphQL (0.13.2) + GraphQL-Sequalize (8.1.0) для обработки запросов.
После создания моделей с помощью sequelize-cli у меня вручную попытался заменить столбец id на uuid. Вот моя модель миграции, которую я использую.
'use strict';
const DataTypes = require('sequelize').DataTypes;
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Currencies', {
uuid: {
primaryKey: true,
type: Sequelize.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false
},
name: {
type: Sequelize.STRING
},
ticker: {
type: Sequelize.STRING
},
alt_tickers: {
type: Sequelize.ARRAY(Sequelize.STRING)
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Currencies');
}
};
Модель:
'use strict';
module.exports = (sequelize, DataTypes) => {
const Currency = sequelize.define('Currency', {
uuid: DataTypes.UUID,
name: DataTypes.STRING,
ticker: DataTypes.STRING,
alt_tickers: DataTypes.ARRAY(DataTypes.STRING)
}, {});
Currency.associate = function(models) {
// associations can be defined here
};
return Currency;
};
Из-за некоторой проблемы sequalize выполняет следующее выражение:
Executing (default): SELECT "id", "uuid", "name", "ticker", "alt_tickers", "createdAt", "updatedAt" FROM "Currencies" AS "Currency" ORDER BY "Currency"."id" ASC;
Это приводит к ошибке «идентификатор столбца не существует».
В качестве альтернативы я попытался исправить это, переименовав столбец uuid в я бы при миграции:
...
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV4()
},
...
А у модели:
'use strict';
module.exports = (sequelize, DataTypes) => {
const Currency = sequelize.define('Currency', {
id: DataTypes.INTEGER,
name: DataTypes.STRING,
ticker: DataTypes.STRING,
alt_tickers: DataTypes.ARRAY(DataTypes.STRING)
}, {});
Currency.associate = function(models) {
// associations can be defined here
};
return Currency;
};
но результатом была следующая ошибка при запуске программы:
Error: A column called 'id' was added to the attributes of 'Currencies' but not marked with 'primaryKey: true'
Заранее спасибо!





Вы не разместили здесь свой код model. Это то, что я думаю, произошло
id на uuid.Следовательно, запрос ищет как id, так и uuid.
Вы можете исправить это, определяя uuid в вашей модели, как показано ниже, и сделав его первичным ключом.
const User = sequelize.define('user', {
uuid: {
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV1,
primaryKey: true
},
username: Sequelize.STRING,
});
sequelize.sync({ force: true })
.then(() => User.create({
username: 'test123'
}).then((user) => {
console.info(user);
}));
Конечно. Взглянуть.
Модель по-прежнему показывает поле id? это должен быть uuid. Вы также должны сделать его первичным ключом primaryKey: true
Я привел два случая. Первая - это таблица с uuid в качестве типа данных UUID, а вторая - с я бы в качестве типа данных UUID, поэтому предоставляются две модели, одна за другой. Если я правильно понял, вы хотите, чтобы я добавил первичный ключ к миграции, но это уже сделано.
Объявление первичного ключа в модели и БД должно происходить независимо и рекомендуется. Поэтому, если вы решаете `Ошибка: столбец с именем 'id' был добавлен к атрибутам 'Currencies', вы должны сделать его первичным ключом в модели, а также в базе данных, поскольку запрос генерируется Sequelize
Хорошо, теперь я понял. Большое спасибо.
Это практически единственный ресурс, который я нашел в Интернете, который объясняет, что нужно для настройки столбца UUID, для которого база данных предоставляет значения по умолчанию, не полагаясь на сторонний пакет uuid npm: https://krmannix.com/2017/05/23/postgres-autogenerated-uuids-with-sequelize/
Укороченная версия:
defaultValue: Sequelize.literal( 'uuid_generate_v4()' )
Собственно, в первую очередь поменяли модель. Я также пытался откатиться к целочисленному «id», но первичный ключ не был установлен в базе данных.