Sequelize 使用查找字段是 CLOB 的位置

问题描述 投票:0回答:1

我在我的 Web API 项目中使用 Sequelize 和 Express。我有一个 Oracle 数据库。

我当前的模型是这样的

const { DataTypes } = require('sequelize');
const DatabaseModule = require('../modules/database.module');
const PortalModel = require('./portal.model');
const ModuleTypeModel = require('./module_type.model');

const constructor = {
    ID: {
        type: DataTypes.STRING,
        primaryKey: true,
    },
    TITLE: {
        type: DataTypes.STRING,
        allowNull: false
    },
    DESCRIPTION: {
        type: DataTypes.TEXT,
        allowNull: false
    },
    PORTAL_ID: {
        type: DataTypes.STRING,
        allowNull: false,
        references: {
            model: PortalModel,
            key: 'ID'
        }
    },
    BACKGROUND_COLOR: {
        type: DataTypes.STRING,
        allowNull: false
    },
    MODULE_TYPE_ID: {
        type: DataTypes.STRING,
        allowNull: false,
        references: {
            model: ModuleTypeModel,
            key: 'ID'
        }
    },
    POSITION: {
        type: DataTypes.INTEGER,
        allowNull: false
    }
}

const Module = DatabaseModule.define('MODULES', constructor, {
    tableName: 'MODULES',
    timestamps: false,
    createdAt: false,
    updatedAt: false
});

Module.belongsTo(PortalModel, { foreignKey: 'PORTAL_ID'});
Module.belongsTo(ModuleTypeModel, { foreignKey: 'MODULE_TYPE_ID'});
Module.addScope('references', {include: [{model: PortalModel}, {model: ModuleTypeModel}]});

Module.constructor = constructor;

DatabaseModule.sync();

module.exports = Module;

在我的服务中,我使用 where 来调用 FindAll 函数:

/**
 * Return list of all modules
 * @returns {ModuleModel[]} 
 */
exports.getModules = async (description) => {
    const modules = await ModuleModel.findAll({where: {DESCRIPTION: description}});
    return modules;
}

当我尝试检索数据时,它返回给我:

DatabaseError [SequelizeDatabaseError]: ORA-00932: inconsistent datatypes: expected - got CLOB

所以我的问题是:当想要的字段是TEXT(CLOB)时如何使用Sequelize find?

node.js oracle sequelize.js
1个回答
0
投票

由于

DataTypes.TEXT
的数据类型已转换为
CLOB
,因此您不能直接使用
where: {<columnName>: value}

您可以使用
Sequelize.Op.like
运算符:
示例:

// import Sequelize.Op
exports.getModules = async (description) => {
    const modules = await ModuleModel.findAll({where: {DESCRIPTION: { [Op.like]: description}}});
    return modules;
}

另一种方法是使用原始查询:

const modules = await DatabaseModule.query(`SELECT * FROM "MODULES" WHERE dbms_lob.compare(DESCRIPTION, to_clob(<description_character>)) = 0`);
© www.soinside.com 2019 - 2024. All rights reserved.