我在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
})
...
答案 0 :(得分:0)
一般来说,迁移和模型规格是不同的 - 所以不要假设你在一个中做什么,你可以在另一个中做。在模型中,您经常指定一些设置并自动发生 - 在迁移过程中,您似乎必须手动设置模型中的自动设置。
因此,当您在模型上执行function testSometing(acceptanceTester $I, \Codeception\Scenario $scenario)
{
$env = $scenario->current();
}
时,您无需指定列.sync()
,createdAt
,updatedAt
(假设您已选择正确的选项包括时间戳并且没有指定您自己的主键 - 但迁移需要明确设置它们。
答案 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