erwartete ich die folgende Abfrage in meiner AnwendungNDB-Query-Erstellung funktioniert nicht wie
query = cls.query().filter(cls.taskgroup_id == taskgroup_id, cls.availability == True, cls.task_id > min_task_id).order(cls.task_id) query.fetch(1)
Above funktioniert wie erwartet haben. (Ruft nur die Entitäten ab, die taskgroup_id entsprechen und verfügbar sind, und task_id> min_task_id)
Allerdings, wenn ich die Abfrage in mehrere Anweisungen aufspalte.
query = cls.query()
query.filter(cls.taskgroup_id == taskgroup_id)
query.filter(cls.availability == True)
query.filter(cls.task_id > min_task_id)
Es funktioniert nicht wie erwartet.
Wenn ich [2] ausführen, Abfrage Formation in mehrere Anweisungen aufgeteilt, gibt es mir eine Entität, deren Verfügbarkeit ist False, und task_id ist gleich min_task_id.
[2] funktioniert nicht wie erwartet (oder wie ich es erwarte). Ich denke, hier ist ein Benutzerfehler. Frage mich, was es ist.
Interessant. Wusste nicht, dass Abfrageobjekte unveränderlich waren. Ich frage mich, was das dahintersteckt. Das Zuweisen von Ergebnissen zu temporären Variablen (obwohl das Problem gelöst wird) macht es meiner Meinung nach hässlich (ich könnte falsch liegen, und es gibt einen guten Grund, das zu tun, denke ich). – user462455
Zum einen gibt es die Möglichkeit, eine oder mehrere verwandte Abfragen mit einem oder mehreren Filtern, die bedingt hinzugefügt wurden, zu konstruieren (zum Beispiel Filter konfigurierbar und auswählbar durch den Benutzer über GUI). Wenn die Abfrage nicht unveränderbar wäre, müssten Abfragen von Grund auf überall in einer potentiell komplexen Bedingungslogik erstellt werden - nicht-DRY und IMHO mit höherer Fehleranfälligkeit. –
Interessant. Ich dachte, dass die Empfehlung, temporäre Variablen zu erstellen, wegen der Unveränderlichkeit genauso fehleranfällig ist. Es ist sehr üblich, Bugs zu sehen, in denen query1 statt query2 (query3 = query1.filter (*) statt query2.filter (*) verwendet wird. Und da es sich um einen logischen Fehler handelt, dauert das Debuggen länger als erwartet.Wäre besser, wenn sie ein veränderbares Abfrageobjekt bereitstellen, so wie Java StringBuilder (veränderbar) zusammen mit String (unveränderlich) bereitstellt. – user462455