如何解决Sequelize为列标识符加引号导致的查询错误?
解决Sequelize 6.27.0自动引号标识符导致的SQL报错问题
你的问题核心是Sequelize自动为表名、列名添加双引号,而目标数据库(如Snowflake)将带引号的标识符视为区分大小写的,与实际数据库中大写的表/列名不匹配,从而触发invalid identifier '"id"'错误。以下是针对Sequelize 6.27.0的可行解决办法:
1. 在方言配置中禁用标识符引号
Sequelize 6.x将quoteIdentifiers移至了方言专属配置里,而非全局options。以Snowflake为例,初始化时通过dialectOptions关闭自动引号:
const sequelize = new Sequelize({ dialect: 'snowflake', dialectOptions: { quoteIdentifiers: false }, // 其他连接参数(账号、仓库等) });
不同数据库方言的参数可能略有差异,需对应调整方言的配置项。
2. 模型定义时显式指定原始标识符
在模型中直接指定表名和列的实际数据库字段名,同时禁止Sequelize自动修改表名:
const Audit = sequelize.define('Audit', { id: { type: DataTypes.INTEGER, field: 'ID' // 匹配数据库中实际的大写列名 }, organizationId: { type: DataTypes.INTEGER, field: 'ORGANIZATION_ID' }, accountLocator: { type: DataTypes.STRING, field: 'ACCOUNT_LOCATOR' }, // 其余字段同理配置对应的field属性 }, { tableName: 'AUDITS.ACCOUNT', // 直接使用数据库中的完整表名 freezeTableName: true, // 禁止Sequelize自动复数化表名 quoteIdentifiers: false // 模型级别禁用引号(部分方言支持) });
3. 临时使用原始SQL查询
如果上述配置无法立即生效,可以直接执行原始SQL绕过自动引号逻辑:
const auditRecords = await sequelize.query( `SELECT ID, ORGANIZATION_ID AS organizationId, ACCOUNT_LOCATOR AS accountLocator, ACCOUNT_DEPLOYMENT AS accountDeployment, AUDIT_ACTION AS auditAction, REASON, REASON_DETAILS AS reasonDetails, EXECUTED_BY AS executedBy, EXECUTED_ON AS executedOn FROM AUDITS.ACCOUNT LIMIT 1;`, { type: Sequelize.QueryTypes.SELECT } );
4. 升级或检查方言插件版本
确保你使用的数据库方言插件(如sequelize-snowflake)与Sequelize 6.27.0版本兼容,旧版本可能存在引号处理的bug,尝试升级到最新适配版本。
内容的提问来源于stack exchange,提问作者LazioTibijczyk
相关产品推荐
相关产品推荐

