【问题标题】:Getting foreign key undefine in Console.log and in api response在 Console.log 和 api 响应中获取外键未定义
【发布时间】:2020-11-20 11:44:50
【问题描述】:

我有表 report_data 属于 daily_entry 表,但是当我调用 api 想获取 daily_entry 表的所有数据时,它会发送如下响应

输出

{
    "response_code": "0",
    "message": "Operation is successfully executed",
    "status": "success",
    "data": {
        "id": 1,
        "user_id": 1,
        "date": "12-10-2020",
         other data ....
        "is_active": true,
        "createdAt": "2020-10-21T06:25:57.877Z",
        "updatedAt": "2020-10-21T06:25:57.877Z",
        "report_datum": {
            "id": 1,
            "entry_i": 1, <<<<<<<----------OUTPUT
            "Date": null,
            "report_document_id": "2",
            "createdAt": "2020-10-21T06:26:02.642Z",
            "updatedAt": "2020-10-21T06:26:02.642Z"
        }
    },
    "level": "info",
    "timestamp": "2020-10-21T06:25:45.947Z"
}

预期

{
    "response_code": "0",
    "message": "Operation is successfully executed",
    "status": "success",
    "data": {
        "id": 1,
        "user_id": 1,
        "date": "12-10-2020",
         other data ....
        "is_active": true,
        "createdAt": "2020-10-21T06:25:57.877Z",
        "updatedAt": "2020-10-21T06:25:57.877Z",
        "report_data": {
            "id": 1,
            "entry_id": 1,<<<<<-------------EXPECTED
            "Date": null,
            "report_document_id": "2",
            "createdAt": "2020-10-21T06:26:02.642Z",
            "updatedAt": "2020-10-21T06:26:02.642Z"
        }
    },
    "level": "info",
    "timestamp": "2020-10-21T06:25:45.947Z"
}

两个表之间的关系是hasOne

db.daily_entry.hasOne(db.report_data, { onDelete: "cascade", foreignKey: 'entry_id', foreignKeyConstraint: true, targetKey: 'id' });

我已经记录了来自 db 的数据,如下所示

 dataValues:{id: 1, entry_i: 1, daily_entry : 8468476, date: 23-10-2020, …}
 get entry_id:ƒ () {\n            return this.get(attribute);\n          }
 undefined

我已经检查了我的整个项目,没有像 entry_i 这样的名称

API I 代码如下

getdaily_entryById: async (req, res) => {
    sequelize.sequelize.transaction(async (t1) => {

        if (!req.params.id) {
            logger.warn(error.MANDATORY_FIELDS)
            return res.status(500).send(error.MANDATORY_FIELDS);
        }

        let data = await sequelize.daily_entry.findOne({
            where: { id: req.params.id },
            include: [
                sequelize.report_data
            ]
        });
        let result = error.OK
        result.data = data

        logger.info(result);
        return res.status(200).send(result);

    }).catch(function (err) {
        logger.warn(err)
        console.log(err)
        return res.status(500).send(error.SERVER_ERROR);
    });
}

daily_entry 表架构

module.exports = function (sequelize, DataTypes) {

    const daily_entry = sequelize.define('daily_entry ', {
    user_id: {
        type: DataTypes.INTEGER(),
        allowNull: true
    },
    date: {
        type: DataTypes.STRING,
        allowNull: true
    },
    report_status: {
        type: DataTypes.STRING,
        allowNull: true
    },
    high_close: {
        type: DataTypes.DOUBLE(),
        allowNull: true
    },
    high_open: {
        type: DataTypes.DOUBLE(),
        allowNull: true
    },
    low_close: {
        type: DataTypes.DOUBLE(),
        allowNull: true
    },
    low_open: {
        type: DataTypes.DOUBLE(),
        allowNull: true
    },
    is_active: {
        type: DataTypes.BOOLEAN,
        allowNull: true
    }
 });

 return daily_entry 

};

report_data 表架构

module.exports = function (sequelize, DataTypes) {

const report_data= sequelize.define('report_data', {
    daily_entry : {
        type: DataTypes.INTEGER(),
        allowNull: true
    },
    Date: {
        type: DataTypes.INTEGER(),
        allowNull: true
    },
    report_document_id: {
        type: DataTypes.TEXT,
        allowNull: true
    }
 },
    {
        tableName: 'report_data'
    });
 return report_data
};

那么,我在哪里做错了,为什么我得到 entry_i 作为外键

【问题讨论】:

  • 如果您使用psql name_of_db 跳转到数据库本身并执行\d daily_entry\d report_data 以便我们可以确认数据库中的模式?
  • 如果从数据库中单独提取这些记录(未连接),数据键是否正确?
  • 你的外键写着foreignKey: 'entry_id,但架构写着daily_entry,这似乎是错误的
  • 我已尝试更改 achema report_datas 的名称并成功获得结果。但我想使用report_data
  • 感谢@GregoryOstermayr 的宝贵时间

标签: javascript node.js postgresql foreign-keys sequelize.js


【解决方案1】:

尝试将您的表名更改为CamelCase,然后尝试。

我知道这应该是评论,但此时我没有评论的特权

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2021-07-05
    • 1970-01-01
    • 2021-12-24
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多