node.js - 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
.
解决方案
使用小写或下划线作为表字段的名称,而不是 camelCase
推荐阅读
- amazon-web-services - 限制 IP 访问的 S3 存储桶策略在 CloudFront 后面不起作用
- c++ - 为什么 sscanf 不处理或忽略 C++ 中的空格?
- python - Python:如何从 StaticMethod 调用 ClassMethod
- javascript - 选择第 n 个元素而不在 scss 中递归执行
- javascript - 为什么 axios.interceptors.request.use 不起作用?
- django - 在 Django 中用于自动完成的 Pycharm 插件
- python - 获取数据帧 pandas 中数据时间的索引
- flutter - 如何将参数传递给 Riverpod 中的 ChangeNotifierProvider?
- r - 如何在rmarkdown中使用输入框和动作按钮输出本地图形
- python - 登录页面上的 Django-LDAP 身份验证