续集文档(http://docs.sequelizejs.com/en/v3/docs/raw-queries/)声明:
如果您传递模型,则返回的数据将是该模型的实例。
// Callee is the model definition. This allows you to easily map a query to a predefined model
sequelize.query('SELECT * FROM projects', { model: Projects }).then(function(projects){
// Each record will now be a instance of Project
})
我为名为agent
的资源定义了一个模型。
module.exports = function(sequelize, DataTypes) {
let Agent = sequelize.define('Agent', {
responseStatus: DataTypes.STRING,
agentnum: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
field : 'agentno'
},
fname : {
type: DataTypes.STRING,
allowNull : false,
field: 'fname'
},
lname : {
type: DataTypes.STRING,
allowNull: false,
field : 'lname'
},
fullname : {
type: DataTypes.STRING,
allowNull : false,
field: 'full_name'
},
status : {
type: DataTypes.STRING,
allowNull: false,
field: 'business_status'
},
loginDate: DataTypes.DATE
}, {
freezeTableName: false,
timestamps: false
});
return Agent;
};
当用我的查询调用sequelize.query
并指定model:Agent时,我从sequelize中抛出一个错误:
TypeError: this.model.bulkBuild is not a function
堆栈指向sequelize\lib\dialects\abstract\query.js:675
。
此错误仍然存在,直到我应用sequelize.QueryTypes.RAW
的QueryType。此时查询完成,我得到一个JSON响应,但它不是我的Agent模型的实例。来自sequelize查询的JSON响应包含应映射到的字段名称。
我根据他们的快速样本(https://github.com/sequelize/express-example/blob/master/models/index.js)中的指示导入了我的模型(只有一个)。模型集合显示我的代理模型已包含在内。
import Sequelize from 'sequelize';
import config from './config';
export default callback => {
const sequelize = new Sequelize(config.database, config.username, config.password, config.params);
sequelize.sync().then(function() {
let db = { }
let agentModel = sequelize.import('model/agent.js');
db[agentModel.name] = agentModel;
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.sequelize.authenticate().then(function() {
console.log('CONNECTION OK');
});
callback(db);
}).catch(function(err) {
console.log('FAILED TO CONNECT: ', err.message);
});
}
我希望查询在运行该查询时返回Agent的实例(从POST调用到我的api)。我正在使用MS SQL Server 2008 R2。
任何输入都表示赞赏。感谢。
EDIT 1/30 以下是生成sequelize对象并传入模型的代码。模型集合显示我的项目已添加,但它没有属性。
connectDb: (function () {
var sequelize;
function createInstance() {
var sequelizeInstance, connectedAndAuthenticated;
sequelizeInstance = new Sequelize(config.database, config.username, config.password, config.params);
connectedAndAuthenticated = sequelizeInstance.authenticate();
connectedAndAuthenticated.sequelize = sequelizeInstance;
connectedAndAuthenticated.Sequelize = Sequelize;
var model = sequelizeInstance.import('../src/model/agent.js');
return connectedAndAuthenticated;
}
return {
getInstance : function () {
if (!sequelize) {
sequelize = createInstance();
}
return sequelize;
}
};
}())
编辑1/26 操作QueryTypes
后,我发现了两件事 - 我无意中在数据库中创建了一个带有模型名称(代理)的表,并且返回的对象的tablename
属性值为空。 schema
和tablename
是由我指定的,但查询是一个连接多个查询和表的存储过程,它不会直接映射到名为Agent
的数据库中的对象。话虽这么说,我的文档似乎暗示这不是也不应该重要,因为我正在创建自己的模型,该模型绑定到查询结果。
答案 0 :(得分:2)
sequelize doc令人困惑。我在解释你使用sequelize的干净方式 放
var models = require('../models');
在您的代码文件中,确保models目录包含您在问题中告诉我的index.js以及Project模型。 要小心,其他正确配置的模型必须没有任何东西。 现在放
models.sequelize.query("select 1 as val").then(function(result){
console.log(result)
})
你的代码中的要检查连接,你也应该使用像
这样的查询 models.Projects.findAll().then(function(result){
console.log(result)
})
答案 1 :(得分:0)
这似乎是一个简单的错字。我不认为Agent
实际上是在你的范围内定义的。我认为你应该通过agentModel
或者你绑定导入的任何内容。
let agentModel = sequelize.import('model/agent.js');
db.sequelize.query( "DECLARE @response VARCHAR(256); EXEC API_Login @agentnum = N'" + agentNum + "', @hashedPassword = '" + password + "', @response = @response OUTPUT; SELECT @response AS N'response'",{ model: agentModel, type: sequelize.QueryTypes.RAW}) .spread(function(Agent) { res.status(200).json(Agent); }) .catch(function(err) { handleError(err, res); });
注意我使用{model: agentModel, ...}
而非{model: Agent, ...}
因为Agent
在回调之外未定义。
如果TypeError: this.model.bulkBuild is not a function
实际上不是模型而是其他内容(或未定义),则您的错误Agent
非常有意义。
<强>更新强>
你在下面的帖子评论中提到:&#34;我已同步模型 - 查询尝试创建一个表,而不是绑定到传入的代理模型&#34;和&#34;它不应该创建一个表&#34;。
为什么你认为就是这种情况?在sync()期间创建表是Sequelize的正常行为。
我认为你误解了Sequelize的作用。它在同步期间为每个注册的模型创建一个表。如果它无法创建该表,则可能返回无效模型,这就是您收到错误的原因。
模型明确地与各个数据库表相关联,这是Sequelize的基本行为。每个模型实例代表该表的一行。如果您正在使用存储过程,那么最好使用本机数据库库并定义自己的抽象层。
我确定您可以禁用和/或覆盖模型与基础数据库表之间的所有默认同步,但在某个点或复杂性上,您基本上只编写了自己的抽象库,并且它从头开始做起来会更干净。
也许你可以按照你想要的方式使用Sequelize,但至少你不应该打电话给sync()
。哪些副作用导致我无法说,但我可以说,除非您定义自己的beforeSync
挂钩sync()
,否则将始终在您的架构中创建一个表:
Model.prototype.sync = function(options) {
options = options || {};
options.hooks = options.hooks === undefined ? true : !!options.hooks;
options = Utils._.extend({}, this.options, options);
var self = this
, attributes = this.tableAttributes;
return Promise.try(function () {
if (options.hooks) {
return self.runHooks('beforeSync', options);
}
}).then(function () {
if (options.force) {
return self.drop(options);
}
}).then(function () {
return self.QueryInterface.createTable(self.getTableName(options), attributes, options, self);
})
...
}).return(this);
};