所以,我使用 sequelize.js 和 tedious
来支持 mssql。 MSSQL = SQL Server 2008
嗯,所以有一张名为 Clientes 的大表。我必须从中获取数据,但它非常庞大,所以我必须通过分页
我尝试了“正确的方式”,如文档中所示:
app.use('/clientes', function(req, res){
var page = req.params.page || 0;
sequelize.Clientes.findAll({limit: 30, offset: 5 })
.then(function(result) {
res.json({result: result});
});
});
它应该可以工作,但它使用的查询类似于
SELECT .......... from [Clientes] as [Clientes] ORDER BY [CNPJ] OFFSET 5 ROWS FETCH NEXT 30 ROWS ONLY;
和 SQL Server 返回一个可怕的 Invalid usage of the option NEXT in the FETCH statement
!因此,经过大量搜索后,我发现 FETCH 显然不适用于 SQL 2008。话虽如此(令人难过),我试图将 TDS 版本强制为 7_3_A。我这样做了
dialectOptions: {
tdsVersion: '7_3_A'
},
但是查询 sintax 并没有因此而改变:(
我不知道该做什么了......我什至会使用另一种方式而不是分页......我发现了一个很好的 SQL 分页语法(涉及
row_number()
),但我无法将它作为原始查询执行在 Sequelize 上。 myModel.query('SQL QUERY HERE')
返回未定义的函数 oO'任何帮助将不胜感激
最佳答案
好的,经过大量的搜索和调试,我发现了两件事。
1) 我的 sequelize 实例是 sequelize.sequelize
,因为 module.exports
和 lodash。我的错,我不记得了,甚至没有在问题中提到它。我对此感到抱歉。
2) offset
和 limit
确实使用了 fetch
,因此为 SQL 2008 生成了无效的 SQL 语法。
我必须使用 sequelize.sequelize.query()
执行原始查询(因为我的实例是 sequelize.sequelize)。
The query used for pagination in mssql 2008 was found In this answer:
这是我的完整代码,包括查询的快速路由和丑陋的格式:
var express = require('express')
var app = express();
app.use('/tableName', function(req, res){
var page = req.params.page || 2;
var rowsPerPage = req.params.perpage || 30;
if(rowsPerPage > 100){
rowsPerPage = 100; //this limits how many per page
}
var theQuery = 'declare @rowsPerPage as bigint; '+
'declare @pageNum as bigint;'+
'set @rowsPerPage='+rowsPerPage+'; '+
'set @pageNum='+page+'; '+
'With SQLPaging As ( '+
'Select Top(@rowsPerPage * @pageNum) ROW_NUMBER() OVER (ORDER BY ID asc) '+
'as resultNum, * '+
'FROM tableName )'+
'select * from SQLPaging with (nolock) where resultNum > ((@pageNum - 1) * @rowsPerPage);';
sequelize.sequelize.query(theQuery)
.spread(function(result) {
res.json({result: result});
});
});
如果你(和我一样)想知道为什么
sequelize.sequelize
而不仅仅是 sequelize
?嗯,这是因为
var sequelize
是来自具有以下 require()
的文件的 module.exports
: module.exports = lodash.extend({
sequelize: sequelize, //reffers to new Sequelize(db,user,pass,{});
Sequelize: Sequelize
}, db)
所以这就是为什么只返回
sequelize.query()
undefined
,并且 sequelize.sequelize.query()
工作正常,因为实际上我的 sequelize
变量是一个对象,其中 sequelize
属性是真正的 Sequelize 连接实例。
关于sql-server - 在 SQL 2008 中使用 Sequelize.js 进行分页(不支持 FETCH),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762168/