Donc, j'utilise sequelize.js avec tedious
pour le support de mssql. MSSQL = SQL Server 2008
Eh bien, il y a donc cette grande table nommée Clientes. Je dois aller chercher des données, mais c'est assez énorme, donc je vais devoir paginer
J'ai essayé la «bonne manière», comme dans les docs:
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}); }); });
Ça devrait marcher, MAIS ça utilise une requête qui est quelque chose comme
SELECT .......... from [Clientes] as [Clientes] ORDER BY [CNPJ] OFFSET 5 ROWS FETCH NEXT 30 ROWS ONLY;
et le SQL Server renvoient une terrible Invalid usage of the option NEXT in the FETCH statement
!
Donc, après beaucoup de search, je suis arrivé à un point où apparemment FETCH ne fonctionnera pas avec SQL 2008. Cela étant dit (et sortingste) j'ai essayé de forcer la version TDS à 7_3_A. Je l'ai fait en utilisant
dialectOptions: { tdsVersion: '7_3_A' },
mais la requête sintax n'a pas changé avec ceci 🙁
Je ne sais plus quoi faire … Je vais même utiliser une autre façon au lieu de paginer … J'ai trouvé une belle sintaxie à la pagination SQL (impliquant row_number()
), mais je n'ai pas pu l'exécuter en tant que requête brute sur sequelyze. myModel.query('SQL QUERY HERE')
renvoyé la fonction non définie oO '
Toute aide sera appréciée
Ok, donc après beaucoup de search et de debugging, j'ai trouvé 2 choses.
1) Mon instance sequelize était sequelize.sequelize
, en raison d'un module.exports
avec lodash. Mon mauvais, je ne m'en souviens pas, et ne l'ai même pas mentionné dans la question. Je suis désolé pour ça.
2) L' offset
et la limit
utilisent fetch
et génèrent donc 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).
La requête utilisée pour la pagination dans mssql 2008 a été trouvée dans cette réponse :
voici mon code complet, y compris le routing express et le format moche pour 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 je l'ai fait) se requestr pourquoi sequelize.sequelize
au lieu de se sequelize
seulement?
Eh bien, c'est parce que var sequelize
est un require()
d'un file avec le module.exports
suivant:
module.exports = lodash.extend({ sequelize: sequelize, //reffers to new Sequelize(db,user,pass,{}); Sequelize: Sequelize }, db)
C'est pourquoi juste sequelize.query()
été renvoyé undefined
, et sequelize.sequelize.query()
fonctionne bien, car en vrai ma variable sequelize
est un object avec la propriété sequelize
étant la véritable instance de connection sequelize.