squerylでクエリを作成すると、Query[T]オブジェクトが返されます。クエリはまだ実行されておらず、Queryオブジェクトを反復処理すると実行されます(Query[T]はIterable[T]を拡張します)。
クエリの実行の前後には、transaction{}またはinTransaction{}ブロックのいずれかが必要です。
SELECTクエリについて話しているだけで、トランザクションは必要ありませんが、squerylフレームワークにはそれらが必要です。
アプリケーションのモデルでクエリを作成し、それをビューに直接渡します。ビューでは、テンプレートのビューヘルパーがクエリを繰り返し処理してデータを表示します。これは、transaction {}ブロックをコントローラーに配置する場合にのみ可能です(コントローラーにはテンプレートの呼び出しが含まれているため、反復を実行するテンプレートも内部にあります)。モデルは実際にはクエリを実行しないため、transaction{}ブロックをモデルに配置することはできません。
しかし、私の理解では、トランザクションはコントローラーとは何の関係もありません。どのデータベースフレームワークを使用するか、どのように使用するか、どこでトランザクションを使用するかは、モデルの決定です。したがって、transaction{}ブロックをモデルに含める必要があります。
Query [T]インスタンスを返す代わりに、このQuery[T]オブジェクトでIterable[T] .toListを呼び出してから、作成されたリストを返すことができることを知っています。次に、クエリ全体がモデルで実行され、すべてが正常に実行されます。しかし、データベースから要求されたすべてのデータをこのリストにキャッシュする必要があるため、このアプローチは好きではありません。このデータをビューに直接渡す方法がいいと思います。結果セットが大きいときに結果セットをストリーミングするMySql機能が好きです。
可能性はありますか?たぶん、データベースにリクエストを送信し、トランザクションを閉じることができる関数Query [T] .executeNow()のようなものですが、それでもMySQLストリーミング機能を使用し、残りの(選択された、したがって修正された)結果セットを次の場合に受け取ります。アクセスしましたか?結果セットはクエリの瞬間に修正されるため、トランザクションを閉じることは問題にはなりません。