Redis
 sql >> Base de données >  >> NoSQL >> Redis

Obtenir tous les objets python-rom dans une liste

Il y a deux problèmes avec le code que vous avez fourni qui expliquent pourquoi vous obtenez les résultats que vous obtenez.

Le premier problème est que votre requête test.query.filter(url ='.').all() renverra une liste vide. Cela renverra une liste vide simplement parce que vous n'avez pas d'index valide à utiliser avec le filtre que vous avez spécifié. Vous avez 2 index pour cette colonne - un index unique (utile pour rechercher des URL par chaîne exacte) et un index de suffixe (utile pour trouver des URL qui se terminent par une certaine chaîne) - mais aucun n'offre la possibilité de filtrer par ce qui serait dans le monde relationnel, une requête "like". Un index de préfixe (créé avec prefix=True ) vous permettrait d'utiliser test.query.like(url='*.') , mais ce serait très lent (il effectue une analyse d'index au lieu d'une recherche directe[1]).

Pour aider à prévenir les problèmes liés aux index/requêtes comme celui-ci, j'ai ajouté des exceptions QueryError lorsque les utilisateurs tentent de filtrer leurs données par des index qui n'existent pas. Je publierai la 0.31.4 un peu plus tard ce soir avec ces changements.

La deuxième erreur que vous avez, qui est la cause de l'exception, est que vous appelez .count() sans argument. Au point de votre h.count() appel, type(h) == list et les objets de liste Python nécessitent un argument pour compter les valeurs égales à l'argument fourni dans la liste. Si vous avez ignoré le .all() partie de votre requête d'origine, vous obtiendrez un objet de requête en retour. Cet objet de requête a un .count() et renverrait un nombre de résultats correspondants.

[1] Toutes les requêtes "like" dans la rom ne sont pas lentes, mais celles qui sont rapides nécessitent des préfixes non génériques pour limiter les plages de données à analyser/filtrer.