Node.jsアプリには、デフォルトのタイムスタンプを含むTIMESTAMP
タイプの列を定義するいくつかのモデルがありますcreated_at
およびupdated_at
。
sequelize.jsのドキュメント によると、DATE
データ型のみがあります。 MySQLにDATETIME
列を作成します。
例:
var User = sequelize.define('User', {
... // columns
last_login: {
type: DataTypes.DATE,
allowNull: false
},
...
}, { // options
timestamps: true
});
代わりにTIMESTAMP
列を生成することは可能ですか?
「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
}
});
}
};
Sequelizeドキュメンテーションによると、Sequelize.NOWのdefaultValueを設定してタイムスタンプフィールドを作成できます。これには効果がありますが、実際にタイムスタンプを設定するのはSequelizeに依存しています。テーブルに「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
私の場合、次のようなモデルを作成します
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
}
})
}
sqLiteで行ったことは拡張されますDataTypes[〜#〜] timestamp [〜#〜]のカスタムsqlロジックで。 sql構文がどのようにMySQLを検索するかは100%わかりませんが、私が持っているものに似ていると思います。例を見てください:
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'