首页 > 解决方案 > SequelizeDatabaseError:列“functionCode”不存在,当它存在时

问题描述

我正在编写一个简单的 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)

./models/index然后是读取模型定义文件以导入模型的标准 NodeJS 代码 ( )。编辑 - 这是我没有提供的唯一代码,但它与这里给出的几乎相同: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.

标签: node.jssequelize.jspostgresql-11

解决方案


使用小写或下划线作为表字段的名称,而不是 camelCase


推荐阅读