Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Paginez avec Sequelize.js à SQL 2008 (qui ne prend pas en charge FETCH)

Ok, donc après de nombreuses recherches et débogages, j'ai trouvé 2 choses.

1) Mon instance de sequelize était sequelize.sequelize , en raison d'un module.exports avec lodash. Mon mauvais, je ne m'en souvenais pas et je ne l'ai même pas mentionné dans la question. Je suis désolé.

2) Le offset et limit utilisez fetch et génère ainsi une syntaxe SQL invalide pour SQL 2008.

J'ai dû effectuer une requête brute, en utilisant sequelize.sequelize.query() (puisque mon instance était sequelize.sequelize).

voici mon code complet, y compris le routage express et le format laid de la requête :

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});
      });
});

Et si vous (comme moi) vous demandez pourquoi sequelize.sequelize au lieu de seulement sequelize ?

Eh bien, c'est parce que var sequelize est un require() à partir d'un fichier avec le module.exports suivant :

 module.exports = lodash.extend({
  sequelize: sequelize, //reffers to new Sequelize(db,user,pass,{});
  Sequelize: Sequelize
 }, db)

C'est pourquoi il suffit de sequelize.query() a été renvoyé undefined , et sequelize.sequelize.query() fonctionne bien, car en vrai mon sequelize la variable est un objet avec le sequelize propriété étant la véritable instance de connexion sequelize.