sequelize.js 时间戳不是日期时间
sequelize.js TIMESTAMP not DATETIME
在我的 node.js 应用程序中,我有几个模型,我想在其中定义 TIMESTAMP
类型的列,包括默认时间戳 created_at
和 updated_at
。
根据sequelize.js' documentation,只有DATE
数据类型。它在 MySQL.
中创建 DATETIME
列
示例:
var User = sequelize.define('User', {
... // columns
last_login: {
type: DataTypes.DATE,
allowNull: false
},
...
}, { // options
timestamps: true
});
是否可以改为生成 TIMESTAMP
列?
我用 sqLite 所做的扩展了 DataTypes 和我的自定义 sql 逻辑 TIMESTAMP 并且效果很好。我不是 100% 确定 sql 语法应该如何查找 MySQL 但我猜它与我所拥有的相似。看例子:
function (sequelize, DataTypes) {
var util = require('util');
var timestampSqlFunc = function () {
var defaultSql = 'DATETIME DEFAULT CURRENT_TIMESTAMP';
if (this._options && this._options.notNull) {
defaultSql += ' NOT NULL';
}
if (this._options && this._options.onUpdate) {
// onUpdate logic here:
}
return defaultSql;
};
DataTypes.TIMESTAMP = function (options) {
this._options = options;
var date = new DataTypes.DATE();
date.toSql = timestampSqlFunc.bind(this);
if (!(this instanceof DataTypes.DATE)) return date;
DataTypes.DATE.apply(this, arguments);
};
util.inherits(DataTypes.TIMESTAMP, DataTypes.DATE);
DataTypes.TIMESTAMP.prototype.toSql = timestampSqlFunc;
var table = sequelize.define("table", {
/* table fields */
createdAt: DataTypes.TIMESTAMP,
updatedAt: DataTypes.TIMESTAMP({ onUpdate: true, notNull: true })
}, {
timestamps: false
});
};
对于MySQL,您需要做的就是在timestampSqlFunc函数中更改SQL类型生成,所以例如 defaultSql 变量将是 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'
根据 Sequelize 文档,您可以设置默认值 Sequelize.NOW 来创建时间戳字段。这有效果,但依赖于 Sequelize 来实际填充时间戳。它不会在 table 上创建“CURRENT_TIMESTAMP”属性。
var Foo = sequelize.define('Foo', {
// default values for dates => current time
myDate: {
type: Sequelize.DATE,
defaultValue: Sequelize.NOW
}
});
因此,这确实实现了拥有时间戳字段的最终目标,但它是通过 Sequelize 而不是通过实际的数据库引擎来控制的。
它似乎也适用于没有时间戳功能的数据库,因此这可能是一个好处。
参考URL:http://sequelize.readthedocs.org/en/latest/docs/models-definition/#definition
只需将 'TIMESTAMP' 字符串传递给您的类型
module.exports = {
up: function (queryInterface, Sequelize) {
return queryInterface.createTable('users', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
created_at: {
type: 'TIMESTAMP',
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false
},
updated_at: {
type: 'TIMESTAMP',
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false
}
});
}
};
在我的例子中,我创建了如下模型
module.exports = (sequelize, type) => {
return sequelize.define('blog', {
blogId: {
type: type.INTEGER,
primaryKey: true,
autoIncrement: true
},
text: type.STRING,
createdAt:{
type: 'TIMESTAMP',
defaultValue: sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false
},
updatedAt:{
type: 'TIMESTAMP',
defaultValue: sequelize.literal('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
allowNull: false
}
})
}
而不是
type: DataTypes.DATE,
使用下面的代码
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('NOW'),
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('NOW'),
},
您还可以使用时刻来创建时间戳:
const moment = require('moment-timezone');
createdAt: {
type: DataTypes.NOW,
allowNull: false,
defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
field: 'createdAt'
},
在我的 node.js 应用程序中,我有几个模型,我想在其中定义 TIMESTAMP
类型的列,包括默认时间戳 created_at
和 updated_at
。
根据sequelize.js' documentation,只有DATE
数据类型。它在 MySQL.
DATETIME
列
示例:
var User = sequelize.define('User', {
... // columns
last_login: {
type: DataTypes.DATE,
allowNull: false
},
...
}, { // options
timestamps: true
});
是否可以改为生成 TIMESTAMP
列?
我用 sqLite 所做的扩展了 DataTypes 和我的自定义 sql 逻辑 TIMESTAMP 并且效果很好。我不是 100% 确定 sql 语法应该如何查找 MySQL 但我猜它与我所拥有的相似。看例子:
function (sequelize, DataTypes) {
var util = require('util');
var timestampSqlFunc = function () {
var defaultSql = 'DATETIME DEFAULT CURRENT_TIMESTAMP';
if (this._options && this._options.notNull) {
defaultSql += ' NOT NULL';
}
if (this._options && this._options.onUpdate) {
// onUpdate logic here:
}
return defaultSql;
};
DataTypes.TIMESTAMP = function (options) {
this._options = options;
var date = new DataTypes.DATE();
date.toSql = timestampSqlFunc.bind(this);
if (!(this instanceof DataTypes.DATE)) return date;
DataTypes.DATE.apply(this, arguments);
};
util.inherits(DataTypes.TIMESTAMP, DataTypes.DATE);
DataTypes.TIMESTAMP.prototype.toSql = timestampSqlFunc;
var table = sequelize.define("table", {
/* table fields */
createdAt: DataTypes.TIMESTAMP,
updatedAt: DataTypes.TIMESTAMP({ onUpdate: true, notNull: true })
}, {
timestamps: false
});
};
对于MySQL,您需要做的就是在timestampSqlFunc函数中更改SQL类型生成,所以例如 defaultSql 变量将是 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'
根据 Sequelize 文档,您可以设置默认值 Sequelize.NOW 来创建时间戳字段。这有效果,但依赖于 Sequelize 来实际填充时间戳。它不会在 table 上创建“CURRENT_TIMESTAMP”属性。
var Foo = sequelize.define('Foo', {
// default values for dates => current time
myDate: {
type: Sequelize.DATE,
defaultValue: Sequelize.NOW
}
});
因此,这确实实现了拥有时间戳字段的最终目标,但它是通过 Sequelize 而不是通过实际的数据库引擎来控制的。
它似乎也适用于没有时间戳功能的数据库,因此这可能是一个好处。
参考URL:http://sequelize.readthedocs.org/en/latest/docs/models-definition/#definition
只需将 'TIMESTAMP' 字符串传递给您的类型
module.exports = {
up: function (queryInterface, Sequelize) {
return queryInterface.createTable('users', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
created_at: {
type: 'TIMESTAMP',
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false
},
updated_at: {
type: 'TIMESTAMP',
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false
}
});
}
};
在我的例子中,我创建了如下模型
module.exports = (sequelize, type) => {
return sequelize.define('blog', {
blogId: {
type: type.INTEGER,
primaryKey: true,
autoIncrement: true
},
text: type.STRING,
createdAt:{
type: 'TIMESTAMP',
defaultValue: sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false
},
updatedAt:{
type: 'TIMESTAMP',
defaultValue: sequelize.literal('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
allowNull: false
}
})
}
而不是
type: DataTypes.DATE,
使用下面的代码
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('NOW'),
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('NOW'),
},
您还可以使用时刻来创建时间戳:
const moment = require('moment-timezone');
createdAt: {
type: DataTypes.NOW,
allowNull: false,
defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
field: 'createdAt'
},