programing

sufficialize.js 타임스탬프가 DATTIME이 아닙니다.

cafebook 2023. 8. 11. 22:35
반응형

sufficialize.js 타임스탬프가 DATTIME이 아닙니다.

node.js app에는 정의하려는 여러 모델이 있습니다.TIMESTAMP기본 타임스탬프를 포함한 열 입력created_at그리고.updated_at.

sufficialize.js의 문서에 따르면 다음과 같은 것이 있습니다.DATE데이터 형식생성됩니다.DATETIME열을 표시합니다.

예:

var User = sequelize.define('User', {
... // columns
last_login: {
            type: DataTypes.DATE,
            allowNull: false
        },
...
}, { // options
        timestamps: true
});

생성이 가능합니까?TIMESTAMP대신 열을 선택하시겠습니까?

'TIM 스탬프' 문자열을 유형에 전달하십시오.

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

Sequetize Documentation에 따라 기본값인 Sequetize 값을 설정할 수 있습니다.이제 타임스탬프 필드를 만듭니다.이렇게 하면 효과가 있지만 실제로 타임스탬프를 채우는 데는 Sequetize에 의존합니다.테이블에 "CURRENT_TIMESTAMP" 특성은 생성되지 않습니다.

var Foo = sequelize.define('Foo', {
    // default values for dates => current time
    myDate: { 
         type: Sequelize.DATE, 
         defaultValue: Sequelize.NOW 
    }
});

따라서 타임스탬프 필드가 있다는 최종 목표는 달성되지만 실제 데이터베이스 엔진이 아닌 Sequitize를 통해 제어됩니다.

또한 타임스탬프 기능이 없는 데이터베이스에서도 작동하는 것으로 나타나 이점이 될 수 있습니다.

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

enter image description here

타임스탬프를 만드는 데 사용할 수도 있습니다.

const moment = require('moment-timezone');

    createdAt: {
      type: DataTypes.NOW,
      allowNull: false,
      defaultValue: moment.utc().format('YYYY-MM-DD HH:mm:ss'),
      field: 'createdAt'
    },

대신에

 type: DataTypes.DATE,

아래 코드를 사용

      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('NOW'),
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('NOW'),
      },

sqLite를 사용하여 수행한 작업은 TIMESTAMP용 사용자 지정 sql 로직으로 확장된 DataTypes이며 잘 작동했습니다.MySQL에 대한 sql 구문이 어떻게 보여야 하는지 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에 대해 필요한 것은 타임스탬프SqlFunc 함수에서 SQL 유형 생성을 변경하는 것입니다. 예를 들어 defaultSql 변수는'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'

언급URL : https://stackoverflow.com/questions/29652538/sequelize-js-timestamp-not-datetime

반응형