Wenn ich eine Abfrage in Squeryl erstellen, wird ein Query [T] -Objekt zurückgegeben. Die Abfrage wurde noch nicht ausgeführt und wird ausgeführt, wenn ich über das Abfrageobjekt iteriere (Abfrage [T] erweitert Iterable [T]).Squeryl: Abfrage explizit ausführen
Um die Ausführung einer Abfrage muss entweder eine Transaktion {} oder ein inTransaction {} Block sein.
Ich spreche nur von SELECT-Abfragen und Transaktionen wäre nicht notwendig, aber das Squeryl-Framework benötigt sie.
Ich möchte eine Abfrage im Modell meiner Anwendung erstellen und direkt an die Ansicht übergeben, wo ein View-Helper in der Vorlage darüber iteriert und die Daten darstellt. Dies ist nur möglich, wenn Sie den Transaktionsblock {} in den Controller setzen (der Controller enthält den Aufruf der Vorlage, also die Vorlage, die die Iteration ebenfalls ausführt). Es ist nicht möglich, den Transaktionsblock {} in das Modell einzufügen, da das Modell die Abfrage nicht wirklich ausführt.
Aber in meinem Verständnis hat die Transaktion nichts mit dem Controller zu tun. Es ist eine Entscheidung des Modells, welches Datenbank-Framework zu verwenden ist, wie es zu verwenden ist und wo Transaktionen zu verwenden sind. Daher möchte ich, dass der Transaktionsblock {} im Modell enthalten ist.
Ich weiß, dass ich - anstatt die Query [T] -Instanz zurückzugeben - Iterable [T] .toList auf diesem Query [T] -Objekt aufrufen und dann die erstellte Liste zurückgeben kann. Dann wird die gesamte Abfrage im Modell ausgeführt und alles ist in Ordnung. Aber ich mag diesen Ansatz nicht, weil alle von der Datenbank angeforderten Daten in dieser Liste zwischengespeichert werden müssen. Ich würde einen Weg bevorzugen, wo diese Daten direkt an die Ansicht weitergegeben werden. Ich mag die MySql-Funktion zum Streamen der Ergebnismenge, wenn sie groß ist.
Gibt es eine Möglichkeit? Vielleicht etwas wie eine Funktion Query [T] .executeNow(), die die Anfrage an die Datenbank sendet, ist in der Lage, die Transaktion zu schließen, aber immer noch die MySQL-Streaming-Funktion und empfängt den Rest der (ausgewählten und damit festen) Ergebnismenge wann es ist zugegriffen? Da die Ergebnismenge im Moment der Abfrage festgelegt ist, sollte das Schließen der Transaktion kein Problem darstellen.
Es wäre schön, wenn Sie Ihre Lösung veröffentlichen würden, sollten Sie eine interessante/überraschende finden. –