web-dev-qa-db-ja.com

DATETIMEではなくsequelize.js TIMESTAMP

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列を生成することは可能ですか?

18
ılǝ

「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
      }
    });
  }
};
12
alucic

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

2
Nate Stone

私の場合、次のようなモデルを作成します

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
        }
    })
}

enter image description here

2
Renish Gotecha

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'

0
Andrey Borisko