【问题标题】:In a Nodejs Sequelize model, how to obtain type information of attributes?在 Nodejs Sequelize 模型中,如何获取属性的类型信息?
【发布时间】:2017-07-21 14:24:50
【问题描述】:

我在NodeJS 中有一个带有Postgressequelize 的工作模型。假设模型是 Person 并具有 nameage 字段。现在我想动态检查模型类并获取有关它的属性的信息,例如它们的 name 和最重要的 type

使用Person.attributes 我得到了一些信息:

name:
{ type:
  { options: [Object],
    _binary: undefined,
    _length: 255 },

但正如您所见,type 对象并未告知 namevarcharboolean

有谁知道,如何通过sequelize获取此信息

【问题讨论】:

  • 这里有什么进展吗?

标签: javascript node.js postgresql sequelize.js


【解决方案1】:

您似乎正在寻找本机类型信息。

我不熟悉 Sequelize,但我知道它在下面使用 node-postgres 驱动程序,它会自动为您进行的每个查询提供类型信息。

下面是动态获取any_table的类型详细信息的简单示例,使用pg-promise

var pgp = require('pg-promise')(/*initialization options*/);
var db = pgp(/*connection details*/);

db.result('SELECT * FROM any_table LIMIT 0', [], a => a.fields)
    .then(fields => {
        // complete details for each column 
    })
    .catch(error => {
        // an error occurred
    });

那里的每一列都有几个可用的字段,包括您正在寻找的namedataTypeID ;)

作为更新,遵循确实使用 Sequelize 的答案...

不同之处在于,这里我们得到 PostgreSQL 提供的直接原始值,因此 dataTypeID 是 PostgreSQL 支持的原始类型 Id,而 TYPE: STRING 是 Sequelize 实现的解释类型。此外,我们在这里动态获取类型详细信息,而不是在 Sequelize 示例中静态获取。

【讨论】:

    【解决方案2】:

    您可以迭代模型的rawAtributes

    for( let key in Model.rawAttributes ){
        console.log('Field: ', key); // this is name of the field
        console.log('Type: ', Model.rawAttributes[key].type.key); // Sequelize type of field
    }
    

    所以nameSequelize.STRING 的例子是

    Field: name
    Type: STRING
    

    或者您可以执行几乎相同的迭代,但使用 Model.rawAttributes[key].type.key 您可以使用 Model.rawAttributes[key].type.toSql(),这将生成此结果

    Field: name
    Type: VARCHAR(255)
    

    编辑

    访问defaultValue的字段:

    Model.rawAttributes[field].defaultValue

    检查字段是否允许NULL 值:

    Model.rawAttributes[field].allowNull

    【讨论】:

    • 作者在他的问题中强调他想动态获取。如果我没记错的话,这是一种静态方法。
    • 他还询问了如何通过 sequelize 获取这些信息。就让他选择最适合他需要的方式,好吗?
    • 我认为最有价值的是能够自动检测到您的静态模型何时过时,需要刷新。
    • 我很满意。非常感谢。下一个问题:如何获取默认值以及列是否可以为 NULL?
    • 我已编辑答案以显示如何访问字段的defaultValueallowNull
    【解决方案3】:

    item.rawAttributes[key].type.key === this.DataTypes.JSONB.key; @piotrbienias 以上比较有效吗? (抱歉写在这里,因为我不能添加cmets)

    【讨论】:

    • 你应该使用 cmets。请删除您的帖子
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2014-05-04
    • 2014-05-27
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多