web-dev-qa-db-fra.com

Sequelize où déclaration avec date

J'utilise séquentiel comme ORM backend. Maintenant, je souhaite faire des opérations sur une date.

Plus précisément, je veux obtenir toutes les données où une date est à partir de maintenant et 7 jours en arrière.

Le problème est que la documentation ne spécifie pas les opérations que vous pouvez effectuer sur Datatypes.DATE

Est-ce que quelqu'un peut-il me montrer la bonne direction?

29
Marc Rasmussen

Tout comme le dit Molda, vous pouvez utiliser $gt, $lt, $gte ou $lte avec une date:

model.findAll({
  where: {
    start_datetime: {
      $gte: moment().subtract(7, 'days').toDate()
    }
  }
})
35
Evan Siroky

J'ai dû importer les symboles des opérateurs à partir de la suite et les utiliser comme ça.

const { Op } = require('sequelize')

model.findAll({
  where: {
    start_datetime: {
      [Op.gte]: moment().subtract(7, 'days').toDate()
    }
  }
})

Selon les documents, pour des raisons de sécurité, cela est considéré comme la meilleure pratique.

Voir http://docs.sequelizejs.com/manual/tutorial/querying.html pour plus d'informations.

L'utilisation de Sequelize sans aucun alias améliore la sécurité. Certains frameworks analysent automatiquement l'entrée utilisateur en objets js et si vous ne nettoyez pas votre entrée, il peut être possible d'injecter un objet avec des opérateurs de chaîne à Sequelize.

(...)

Pour une meilleure sécurité, il est fortement conseillé d'utiliser Sequelize.Op et de ne dépendre d'aucun alias de chaîne. Vous pouvez limiter l'alias dont votre application aura besoin en définissant l'option operatorsAliases, n'oubliez pas de filtrer les entrées utilisateur, en particulier lorsque vous les passez directement aux méthodes Sequelize.

37
James Graham

Vous pouvez également utiliser Sequelize.literal() pour effectuer une manipulation de dates en SQL.

Le code suivant fonctionne avec Postgres, mais je suis sûr que quelque chose de similaire pourrait également être fait dans d'autres systèmes:

model.findAll({
  where: {
    start_datetime: {
      $gte: Sequelize.literal('NOW() - INTERVAL "7d"'),
    }
  }
})

0
marcopeg