Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Paginar com Sequelize.js no SQL 2008 (que não suporta FETCH)


Ok, então depois de muita pesquisa e depuração, encontrei 2 coisas.

1) Minha instância de sequelize foi sequelize.sequelize , devido a um module.exports com lodas. Que pena, não me lembrava disso e nem mencionei na pergunta. Sinto muito por isso.

2) O offset e limit use fetch e, portanto, gera sintaxe SQL inválida para SQL 2008.

Eu tive que realizar uma consulta bruta, usando sequelize.sequelize.query() (já que minha instância foi sequelize.sequelize).

aqui está meu código completo, incluindo roteamento expresso e formato feio para a consulta:
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});
      });
});

E se você (como eu) se pergunta por que sequelize.sequelize em vez de apenas sequelize ?

Bem, isso ocorre porque var sequelize é um require() de um arquivo com o seguinte module.exports :
 module.exports = lodash.extend({
  sequelize: sequelize, //reffers to new Sequelize(db,user,pass,{});
  Sequelize: Sequelize
 }, db)

Então é por isso que apenas sequelize.query() foi retornado undefined e sequelize.sequelize.query() funciona bem, porque na verdade meu sequelize variável é um objeto com o sequelize propriedade sendo a instância de conexão de sequela real.