【问题标题】:Paginate with Sequelize.js at SQL 2008 (that does not support FETCH)在 SQL 2008 中使用 Sequelize.js 进行分页(不支持 FETCH)
【发布时间】:2015-12-22 02:31:05
【问题描述】:

所以,我正在使用带有tedious的 sequelize.js 以获得 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()),但我无法执行它作为对 sequelyze 的原始查询。 myModel.query('SQL QUERY HERE')返回未定义函数oO'

任何帮助将不胜感激

【问题讨论】:

  • 您需要调用sequelize.query(续集实例),而不是myModel.query(模型)。如果您有一个不错的限制和偏移实现,请随时将其发布到 github.com/sequelize/sequelize/issues 或打开拉取请求
  • @JanAagaardMeier,对不起,我错了,我正在使用 sequelize.query('Select.....') 并得到了未定义的函数.. 但我会仔细检查并让你知道......好吧,我拥有并且应该工作的是一个简单的 SQL 查询,它使用 ROW_NUMBER() OVER(ORDER BY...)
  • 嘿@JanAagaardMeier,我做了sequelize.query('SELECT * FROM (SELECT t.id, ROW_NUMBER() OVER (ORDER BY t.cnpj) as rownum FROM (SELECT t1.cnpj FROM Clientes t1) as t) AS u WHERE u.rownum > 5 AND u.rownum <= 10') 并得到了typeError: undefined is not a function 我尝试了require('sequelize') 和我的实例

标签: sql-server sql-server-2008 express pagination sequelize.js


【解决方案1】:

好的,经过大量搜索和调试,我发现了两件事。

1) 我的 sequelize 实例是 sequelize.sequelize,由于带有 lodash 的 module.exports。我的错,我不记得了,甚至没有在问题中提到它。对此我很抱歉。

2) offsetlimit 确实使用了fetch,因此为 SQL 2008 生成了无效的 SQL sintax。

我必须使用 sequelize.sequelize.query() 执行原始查询(因为我的实例是 sequelize.sequelize)。

在mssql 2008中用于分页的查询找到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 是来自具有以下module.exports 的文件的require()

 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 连接实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2011-01-15
    • 2013-02-21
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多