在Sequelize迁移中创建时间戳

时间:2015-08-30 00:30:13

标签: sequelize.js

我使用SequelizeJS作为我的ORM。

我有一个"视频"模型。该模型使用"视频"表。

如何创建包含时间戳的迁移?我是否需要定义自己的时间戳列,或者是否有快捷方式?

/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');
  }
};

/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,
    }
  });
}

/models/index.js (这是通过运行$ 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;

1 个答案:

答案 0 :(得分:2)

使用迁移时,不会为您创建主键,updatedAt和createdAt字段。相反,您应该确保在迁移中创建这些列。

要使updatedAt和createdAt列自动更新,您可以在模型中使用钩子。

即:

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;
}

^离开我的头顶而没有经过测试!