首页 > 解决方案 > 续集如何将日期格式化为 YYYY-MM-DD HH:mm:ss 并将列保持为蛇形

问题描述

嗨,我正在使用带有 Postgres 数据库的 Sequelize

所以我试图在续集 createdAt 和 updatedAt 列上格式化日期以及YYYY-MM-DD HH:mm:ss将列保持为snake_case而不是camelcase,这样它们就可以了created_atupdated_at我该如何实现呢?我尝试了以下方法:

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

或者

    createdAt: {
      type: DataTypes.DATE,
      defaultValue: sequelize.NOW,
      set(value) {
        return value.toISOString().replace(/\..+/g, '')
// coming in the db as 2021-10-31 01:34:48.81+00 so wanted to remove evrything after the dot
      },
      name: 'createdAt',
      field: 'created_at',
    },

不工作,我收到此错误

          throw new Error(`Value for "${key}" option must be a string or a boolean, got ${typeof this.options[key]}`);
          ^

Error: Value for "createdAt" option must be a string or a boolean, got object

这是上面定义的整个表格是我已经确定的我需要帮助的内容

  const Supplier = sequelize.define('Supplier', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      allowNull: false,
      primaryKey: true
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        len: [1, 50]
      }
    },
    description: {
      type: DataTypes.STRING,
      allowNull: true,
    },
  }, {
    tableName: 'suppliers',
    timestamps: true,
    createdAt: {
      type: DataTypes.DATE,
      defaultValue: sequelize.NOW,
      set(value) {
        return value.toISOString().replace(/\..+/g, '')
      },
      name: 'createdAt',
      field: 'created_at',
    },
    updatedAt: {
      type: DataTypes.DATE,
      defaultValue: sequelize.NOW,
      set(value) {
        return value.toISOString().replace(/\..+/g, '')
      },
      field: 'updated_at',
    },
    // freezeTableName: true
    // paranoid: true
  });

谢谢

今天 Sequelize docs 在这里不起作用,它是一个网络存档

https://web.archive.org/web/20200731154157/http://sequelize.org/master/index.html

标签: javascriptnode.jspostgresqldatesequelize.js

解决方案


据我了解,您的问题包含一些子问题:

  • Sequelize 表列下划线名称;
  • 续集日期格式;
  • 片刻使用;

这是我刚刚得到的一些工作示例(具有上述要求):

像这样进行后续迁移:

'use strict';

module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('items', {
            // ...
            created_at: {
                allowNull: false,
                type: Sequelize.DATE
            },
            // ...
        });
    },
    down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('items');
    }
};

有一个像这样的续集模型:

'use strict';

// WITH moment
// const moment = require('moment');

module.exports = (sequelize, DataTypes) => {
    // const now = new Date();
    return sequelize.define('Item', {
        // ...
        created_at: {
            allowNull: false,
            // defaultValue: now,
            type: DataTypes.DATE,
            get() {
                // 1. WITHOUT moment
                const date = new Date(`${this.dataValues.created_at}`);
                return `${date.toISOString().split('T')[0]} ${date.toLocaleTimeString([], {month: '2-digit', timeStyle: 'medium', hour12: false})}`;
                
                // 2. WITHOUT moment (another solution)
                // const parts = date.toISOString().split('T');
                // return `${parts[0]} ${parts[1].substring(0, 8)}`;
                
                // 3. WITH moment
                // return moment(this.dataValues.created_at).format('D MM YYYY HH:mm:ss'); // 'D MMM YYYY, LT'
            }
        },
        // ...
    }, {
        tableName: 'items',
        freezeTableName: true,
        // underscored: true,
        timestamps: false,
        charset: 'utf8',
        collate: 'utf8_general_ci'
    });
};

不要忘记根据需要重命名表名,这里是“项目”。

似乎在 github 上发布了一个带有 sequelize "underscored" 属性的问题。无论如何它对我有用,因为其他属性有一个小技巧,所以就这样做,我相信它应该工作(我的 Sequelize 版本是“^5.22.3”)。

我用过的来源:

如果需要,请随意编辑和优化(我在 get() 方法中进行了一些小的编辑以获得所需的确切格式,无论如何我更喜欢使用 moment 作为列访问器)。


推荐阅读