Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Alle Python-ROM-Objekte in eine Liste bringen

Es gibt zwei Probleme mit dem von Ihnen bereitgestellten Code, die erklären, warum Sie die Ergebnisse erhalten, die Sie erhalten.

Das erste Problem ist, dass Ihre Abfrage test.query.filter(url ='.').all() gibt eine leere Liste zurück. Dadurch wird eine leere Liste zurückgegeben, einfach weil Sie keinen gültigen Index haben, der mit dem von Ihnen angegebenen Filter verwendet werden kann. Sie haben 2 Indizes für diese Spalte – einen eindeutigen Index (nützlich zum Suchen von URLs nach exakter Zeichenfolge) und einen Suffixindex (nützlich zum Suchen von URLs, die mit einer bestimmten Zeichenfolge enden) – aber keiner bietet die Möglichkeit, nach dem zu filtern, was wäre in der relationalen Welt eine „Gefällt mir“-Abfrage. Ein Präfixindex (erstellt mit prefix=True ) würde Sie test.query.like(url='*.') verwenden lassen , aber das wäre sehr langsam (es führt einen Index-Scan anstelle einer direkten Suche durch[1]).

Um solche index-/abfragebezogenen Probleme zu vermeiden, habe ich QueryError-Ausnahmen hinzugefügt, wenn Benutzer versuchen, ihre Daten nach nicht vorhandenen Indizes zu filtern. Ich werde 0.31.4 etwas später heute Abend mit diesen Änderungen veröffentlichen.

Der zweite Fehler, der die Ursache der Ausnahme ist, besteht darin, dass Sie .count() aufrufen ohne Argument. An der Stelle Ihres h.count() Aufruf, type(h) == list , und Python-Listenobjekte erfordern ein Argument, um Werte zu zählen, die dem angegebenen Argument in der Liste entsprechen. Wenn Sie .all() übersprungen haben Teil Ihrer ursprünglichen Abfrage erhalten Sie ein Abfrageobjekt zurück. Dieses Abfrageobjekt hat einen .count() -Methode und würde eine Anzahl übereinstimmender Ergebnisse zurückgeben.

[1] Nicht alle „Gefällt mir“-Abfragen in ROM sind langsam, aber die schnellen erfordern Präfixe ohne Platzhalter, um die zu scannenden/filternden Datenbereiche einzuschränken.