【问题标题】:SequelizeDatabaseError: column \"functionCode\" does not exist, when it doesSequelizeDatabaseError:列 \"functionCode\" 不存在,当它存在时
【发布时间】:2019-06-23 04:34:56
【问题描述】:

我正在编写一个简单的 NodeJS 代码来使用 sequelize 从/向 postgres 读取/写入。我的代码适用于一个表,但类似的代码在测试另一个不相关的表时会中断。从错误堆栈跟踪中可以看出,我还发现引发的错误令人困惑。

我禁用了时间戳列并在 CLI 上执行了 sequelize 有问题的 SQL。

首先,这是 /tfnMetadata.js

中的模型
'use strict';

/**
 * Model definition: See http://docs.sequelizejs.com/manual/models-definition.html
 *  See DataTypes: http://docs.sequelizejs.com/manual/data-types.html
 * @param
 * @returns {*} records.
 */
module.exports = (sequelize, DataTypes) => {
  const tfnMetadata = sequelize.define('tfn_metadata', {
    did: {
      type: DataTypes.STRING, primaryKey: true, allowNull: false,
    },
    dnis: {
      type: DataTypes.STRING,
    },
    functionCode: {
      type: DataTypes.STRING,
    },
    country: {
      type: DataTypes.STRING,
    },
    language: {
      type: DataTypes.STRING,
    },
    coBrand: {
      type: DataTypes.BOOLEAN,
    },
    collections: {
      type: DataTypes.BOOLEAN,
    },
    smallBusiness: {
      type: DataTypes.BOOLEAN,
    },
    welcomeMessageCode: {
      type: DataTypes.STRING,
    },
    welcomeMessage: {
      type: DataTypes.TEXT,
    },
    referenceKey: {
      type: DataTypes.STRING,
    },
    partner: {
      type: DataTypes.STRING,
    },
  }, { timestamps: false, tableName: 'tfn_metadata' });
  tfnMetadata.sync({ alter: true });
  return tfnMetadata;
};

psql中表对应的schema是:

专栏 |类型 |可空 | --------------------+------------------------+---- ------+ 做了|字符变化(15) |不为空 | dns |字符变化(15) | | 功能码 |字符变化(20) | | 国家 |字符变化(25) | | 语言 |字符变化(20) | | 联合品牌 |布尔值 | | 收藏 |布尔值 | | 小型企业 |布尔值 | | 欢迎留言代码 |正文 | | 欢迎留言 |字符变化(200) | | 参考号 |字符变化(50) | | 合作伙伴 |性格变化(50)

然后是读取模型定义文件以导入模型的标准 NodeJS 代码 (./models/index)。编辑 - 这是我没有提供的唯一代码,但与此处给出的代码几乎相同:https://sequelize.readthedocs.io/en/1.7.0/articles/express/

使用以下函数在 query.js 文件中执行查询:

const models = require('./models/index');

const getByPk = async (didNumber) => {
  try {
    const record = await models.tfnMetadata.findByPk(didNumber.toString());
    logger.info('Query.getByPk() Returned the record from db.', record);
    return record.dataValues;
  } catch (err) {
    logger.error('Query.getByPk() failed:', err);
    throw err;
  }
};

上面的代码是在client.js中调用的——


const query = require('../../src/clients/pg/query');
const tfnData = await query.getByPk(did);


但它失败了 -

Query.getByPk() Request to get record for did=111 undefined
Query.getByPk() failed: {
  "name": "SequelizeDatabaseError",
  "parent": {
    "name": "error",
    "length": 184,
    "severity": "ERROR",
    "code": "42703",
    "hint": "Perhaps you meant to reference the column \"tfn_metadata.functioncode\".",
    "position": "23",
    "file": "parse_relation.c",
    "line": "3294",
    "routine": "errorMissingColumn",
    "sql": "SELECT \"did\", \"dnis\", \"functionCode\", \"country\", \"language\", \"coBrand\", \"collections\", \"smallBusiness\", \"welcomeMessageCode\", \"welcomeMessage\", \"referenceKey\", \"partner\" FROM \"tfn_metadata\" AS \"tfn_metadata\" WHERE \"tfn_metadata\".\"did\" = '111';"
  }
error: End - Error:
error: {
    "errorMessage": "column \"functionCode\" does not exist",
    "errorType": "SequelizeDatabaseError",
    "stackTrace": [
        "Query.formatError (/Users/.../node_modules/sequelize/lib/dialects/postgres/query.js:354:16)",
        "query.catch.err (/Users/.../node_modules/sequelize/lib/dialects/postgres/query.js:71:18)",
        "tryCatcher (/Users/.../node_modules/bluebird/js/release/util.js:16:23)",
        "Promise._settlePromiseFromHandler (/Users/.../node_modules/bluebird/js/release/promise.js:512:31)",

错误代码表示未定义列或缺少列functionCode,提示询问我是否打算引用functionCode

【问题讨论】:

  • "functionCode"functioncode 的名称不同,您应该从 SQL 字符串中删除双引号 - 您的所有列都不需要引用。使用:"sql": "SELECT did, dnis, functionCode, country, language, coBrand, collections, smallBusiness ... FROM tfn_metadata WHERE tfn_metadata.did = '111';"
  • @a_horse_with_no_name 我输入 functionCode 的唯一地方是在模型定义中,postgres 使所有列名都小写,如打印的表模式中所示。其次,错误堆栈中打印的sql字符串是创建的sql ORM包,我没有传递或创建它。有趣的是,当我从 Postgres 客户端执行相同的 sql 时(在删除 \" 之后),查询工作。所以,如果有一个列名,那么它在哪里得到错误的列名是令人困惑的。
  • @Vish 您没有包含所有代码,或者您在生成架构后更改了它 - 我可以告诉您,因为您问题中的日志消息与 query.js 中的代码不匹配你提供了。
  • @doublesharp 我没有排除任何代码。但是,我确实包含了参考或缺失的代码,我认为这对理解代码没有影响,因此没有添加到原始帖子中。我再次运行代码并得到相同的错误堆栈。
  • 表格名称使用小写或下划线,而不是驼峰式。

标签: node.js sequelize.js postgresql-11


【解决方案1】:

表格字段的名称使用小写或下划线,而不是驼峰式

【讨论】:

  • 模型字段可以在驼峰式或任何情况下定义,如果它们还具有具有实际列名值的字段属性。并且 pg 中的列名是小写的。所以 - json functionCode: { type: DataTypes.STRING, field: 'functioncode', }
猜你喜欢
  • 2021-04-04
  • 2022-11-10
  • 2018-04-29
  • 2019-06-15
  • 1970-01-01
  • 2017-02-19
  • 2019-11-12
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多