使用 Sequelize.js 在 SQL 2008 分页(不支持 FETCH)
Paginate with Sequelize.js at SQL 2008 (that does not support FETCH)
因此,我使用 sequelize.js 和 tedious
来支持 mssql。 MSSQL = SQL 服务器 2008
嗯,所以有这么大的 table 叫 Clientes。我必须从中获取数据,但它非常庞大,所以我必须分页 trhough
我尝试了 'right way',如文档中所述:
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 服务器 return 太糟糕了 Invalid usage of the option NEXT in the FETCH statement
!
因此,经过大量搜索后,我发现 FETCH 显然无法与 SQL 2008 一起使用。话虽这么说(令人难过),但我试图将 TDS 版本强制为 7_3_A .我使用
做到了这一点
dialectOptions: {
tdsVersion: '7_3_A'
},
但是查询语法并没有因此改变:(
我不知道该怎么做了....我什至会使用另一种方式而不是分页...我找到了一个很好的 SQL 分页语法(涉及 row_number()
) ,但我无法将其作为对 sequelyze 的原始查询来执行。 myModel.query('SQL QUERY HERE')
returned 未定义函数 oO'
任何帮助将不胜感激
好的,经过大量的搜索和调试,我发现了两件事。
1) 由于带有 lodash 的 module.exports
,我的续集实例是 sequelize.sequelize
。我的错,我不记得了,甚至没有在问题中提到它。对此我感到很抱歉。
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.js 和 tedious
来支持 mssql。 MSSQL = SQL 服务器 2008
嗯,所以有这么大的 table 叫 Clientes。我必须从中获取数据,但它非常庞大,所以我必须分页 trhough
我尝试了 'right way',如文档中所述:
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 服务器 return 太糟糕了 Invalid usage of the option NEXT in the FETCH statement
!
因此,经过大量搜索后,我发现 FETCH 显然无法与 SQL 2008 一起使用。话虽这么说(令人难过),但我试图将 TDS 版本强制为 7_3_A .我使用
做到了这一点dialectOptions: {
tdsVersion: '7_3_A'
},
但是查询语法并没有因此改变:(
我不知道该怎么做了....我什至会使用另一种方式而不是分页...我找到了一个很好的 SQL 分页语法(涉及 row_number()
) ,但我无法将其作为对 sequelyze 的原始查询来执行。 myModel.query('SQL QUERY HERE')
returned 未定义函数 oO'
任何帮助将不胜感激
好的,经过大量的搜索和调试,我发现了两件事。
1) 由于带有 lodash 的 module.exports
,我的续集实例是 sequelize.sequelize
。我的错,我不记得了,甚至没有在问题中提到它。对此我感到很抱歉。
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
属性 是真正的续集连接实例。