I'm creating a DB model via Sequelize CLI with this command:
sequelize model:create --name User --attributes "firstname:string, lastname:string"
This creates the corresponding migration script:
'use strict';
module.exports = {
up: function(queryInterface, Sequelize) {
return queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
firstname: {
type: Sequelize.STRING
},
lastname: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: function(queryInterface, Sequelize) {
return queryInterface.dropTable('Users');
}
};
As shown, the primary key is set to integer
.
Is there a way to default the CLI to use UUID
instead?
You'd have to edit the generated file manually, changing Sequelize.INTEGER
to Sequelize.UUID
, then remove the autoIncrement: true
.
npm install uuid
So your model would look like this:
const uuid = require('uuid/v4'); // ES5
'use strict';
module.exports = {
up: function(queryInterface, Sequelize) {
return queryInterface.createTable('Users', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID
},
/* Other model properties */
});
},
down: function(queryInterface, Sequelize) {
return queryInterface.dropTable('Users');
}
};
Update your beforeCreate
hook as follows:
const uuid = require('uuid/v4');
export default (sequelize, DataTypes) => {
const User = sequelize.define('User', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID
},
...
}, {});
User.beforeCreate(user => user.id = uuid());
return User;
};
This assumes you are using Sequelize v4.