Sequelize,设置时间戳:true在迁移中创建createdAt updatedAt列吗?

时间:2015-06-29 19:00:50

标签: sequelize.js

我在sequelize中的迁移脚本没有创建创建时间戳列createdAt,updatedAt

Error: SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'createdAt' in 'field list'

我认为在迁移定义中将时间戳设置为true会自动创建列,我错了吗?

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.createTable('User', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false
      },
      uname: {
        type: Sequelize.STRING(50)
      }

    },{
      timestamps: true
    })
...

2 个答案:

答案 0 :(得分:0)

一般来说,迁移和模型规格是不同的 - 所以不要假设你在一个中做什么,你可以在另一个中做。在模型中,您经常指定一些设置并自动发生 - 在迁移过程中,您似乎必须手动设置模型中的自动设置。

因此,当您在模型上执行function testSometing(acceptanceTester $I, \Codeception\Scenario $scenario) { $env = $scenario->current(); } 时,您无需指定列.sync()createdAtupdatedAt(假设您已选择正确的选项包括时间戳并且没有指定您自己的主键 - 但迁移需要明确设置它们。

答案 1 :(得分:0)

我来晚了,但是为了清楚起见,我会回答。我想您误解了它的意思。

时间戳标记在模型定义页面的配置部分中指定,并且与偏执,下划线,freezetablename,表名和版本标志一起,“影响Sequelize处理列名的方式“ ,在某些情况下是一种行为。 http://docs.sequelizejs.com/manual/tutorial/models-definition.html#configuration

在同一模型定义页面的时间戳部分下,有下一条注释:

  

如果您正在使用Sequelize迁移,则需要添加   迁移定义的createdAt和updatedAt字段:

它指定手动将时间戳字段添加到迁移中

module.exports = {
  up(queryInterface, Sequelize) {
    return queryInterface.createTable('my-table', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
      },

      // Timestamps
      createdAt: Sequelize.DATE,
      updatedAt: Sequelize.DATE,
    })
  },
  down(queryInterface, Sequelize) {
    return queryInterface.dropTable('my-table');
  },
}

http://docs.sequelizejs.com/manual/tutorial/models-definition.html#timestamps