プロジェクトの ORM として Peewee モジュールを使用しています。
ドキュメント全体を読みましたが、db.execute_sql() からの結果を処理する方法に関する明確な例はありません。
私はコードをトレースしましたが、 db.execute_sql() がカーソルを返すことしかわかりません。
カーソルを反復処理して複雑な選択ステートメントから結果を取得するなど、カーソルを処理する方法を知っている人はいますか?
更新: peewee フォルダーから次のソース コードを見つけました。この問題の解決に役立つはずです。
クラス QueryResultWrapper(オブジェクト):
"""
生のクエリの結果に対する反復子を提供し、さらに次のことを行います
2つのこと:
- データベースからの行を Python 表現に変換します
- 複数の反復によって複数のクエリが発生しないようにする
"""
def __init__(自己、モデル、カーソル、メタ = なし):
self.model = モデル
self.cursor = カーソル
self.__ct = 0
self.__idx = 0
self._result_cache = []
self._populated = False
self._initialized = False
メタが None でない場合:
self.column_meta、self.join_meta = メタ
そうしないと:
self.column_meta = self.join_meta = なし
def __iter__(自己):
self.__idx = 0
self._populated でない場合:
自分を返す
そうしないと:
return iter(self._result_cache)
def process_row (自己、行):
行を返す
デフ反復(自己):
行 = self.cursor.fetchone()
行でない場合:
self._populated = True
StopIterationを上げる
elif は self._initialized ではありません:
self.initialize(self.cursor.description)
self._initialized = True
return self.process_row(行)
デフイテレータ(自己):
True の間:
yield self.iterate()
デフネクスト(セルフ):
if self.__idx self.__ct):
試す:
セルフ.ネクスト()
StopIteration を除く:
壊す