I'm using SequelizeJS for my ORM.
I have a "Video" model. This model uses the "Videos" table.
How can I create a migration that includes timestamps? Do I need to define my own timestamp columns, or is there a shortcut?
In /migrations/123412341234-create-videos-table.js
'use strict';
module.exports = {
up: function (queryInterface, Sequelize) {
queryInterface.createTable(
'Videos',
{
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
title: {
type: Sequelize.STRING,
allowNull: false,
unique: true
},
author: {
type: Sequelize.STRING,
allowNull: false
},
videoUrl: {
type: Sequelize.STRING,
},
coverUrl: {
type: Sequelize.STRING,
}
}
);
},
down: function (queryInterface, Sequelize) {
queryInterface.dropTable('Videos');
}
};
In /models/video.js
module.exports = function(sequelize, DataTypes) {
return sequelize.define('Video', {
title: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
author: {
type: DataTypes.STRING,
allowNull: false
},
videoUrl: {
type: DataTypes.STRING,
},
coverUrl: {
type: DataTypes.STRING,
}
});
}
In /models/index.js (this is the default created by running $ sequelize init
)
'use strict';
var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(module.filename);
var env = process.env.NODE_ENV || 'development';
var config = require(__dirname + '/../config/config.json')[env];
var db = {};
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
var sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(function(file) {
return (file.indexOf('.') !== 0) && (file !== basename);
})
.forEach(function(file) {
if (file.slice(-3) !== '.js') return;
var model = sequelize['import'](path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(function(modelName) {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
When using migrations, the primary keys, updatedAt and createdAt fields are not created for you. Instead, you should make sure that you create these columns in your migration.
For the updatedAt and createdAt columns to update automatically, you can use hooks in the model.
I.e:
module.exports = function (sequelize, DataTypes) {
var Person = sequelize.define('Person', {
id: {
type: DataTypes.INTEGER,
primary: true,
autoincrement: true
},
name: DataTypes.STRING,
updatedAt: DataTypes.DATE,
createdAt: DataTypes.DATE
}, {
hooks: {
beforeCreate: function (person, options, fn) {
person.createdAt = new Date();
person.updatedAt = new Date();
fn(null, person);
},
beforeUpdate: function (person, options, fn) {
person.updatedAt = new Date();
fn(null, person);
}
}
});
return Person;
}
^Going off the top of my head and not tested!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With