【发布时间】: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