在 Sequelize 迁移中创建时间戳

Don*_*n P 8 sequelize.js

我正在为我的 ORM 使用 SequelizeJS。

我有一个“视频”模型。此模型使用“视频”表。

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

/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');
  }
};
Run Code Online (Sandbox Code Playgroud)

/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,
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

/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;
Run Code Online (Sandbox Code Playgroud)

swi*_*fty 7

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

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

IE:

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;
}
Run Code Online (Sandbox Code Playgroud)

^这是我的想法,未经测试!

  • 您根本不需要添加钩子,sequelize 会为您管理该逻辑(如果您没有在模型定义选项中添加“timestamps: false”) (2认同)