Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create timestamps in a Sequelize migration

Tags:

sequelize.js

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;
like image 543
Don P Avatar asked Aug 30 '15 00:08

Don P


1 Answers

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!

like image 151
swifty Avatar answered Oct 16 '22 20:10

swifty