我在我的 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?
由于
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`);