web-dev-qa-db-ja.com

Python Peewee execute_sql()の例

プロジェクトのORMとしてPeeweeモジュールを使用しています。

ドキュメント全体を読みましたが、db.execute_sql()からの結果を処理する方法に関する明確な例はありません。

コードをトレースしましたが、db.execute_sql()がカーソルを返すことしかわかりません。

カーソルを繰り返し処理して複雑なselectステートメントから結果を取得するなど、カーソルを処理する方法を知っている人はいますか。

更新:peeweeフォルダーから次のソースコードを見つけました。この問題の解決に役立つはずです。

 class QueryResultWrapper(object):
 "" "
生のクエリの結果に対する反復子を提供し、さらに
 2つのことを実行します:
 -データベースの行をpython表現
に変換します-複数の反復で複数のクエリが発生しないようにします
 "" "
 def __init __( self、model、cursor、meta = None):
 self.model = model 
 self.cursor = cursor 
 
 self .__ ct = 0 
 self .__ idx = 0 
 
 self._result_cache = [] 
 self._populated = False 
 self._initialized = False 
 
 metaがNoneでない場合:
 self.column_meta、self.join_meta = meta 
 else:
 self.column_meta = self.join_meta = None 
 
 def __iter __(self):
 self .__ idx = 0 
 
 self._populated:
 return self 
 else:
 return iter(self._result_cache)
 
 def process_row(self、row):
 return row 
 
 def iterate(self):
 row = self.cursor.fetchone()
行でない場合:
 self._populated = True 
 raise StopIteration 
 Elif not self._initialized:
 self.initialize(self.cursor.description)
 self._initialized = True 
 return self.process_row(row)
 
 def iterator(self):
 while True:
 yield self.iterate()
 
 def next(self):
 if self .__ idx self .__ ct):
 try:
 self.next()
ただしStopIteration:
 break 
13
user1187968

Peeweeはカーソルを返します。次に、db-api2を使用して反復できます。

cursor = db.execute_sql('select * from tweets;')
for row in cursor.fetchall():
    print(row)

cursor = db.execute_sql('select count(*) from tweets;')
res = cursor.fetchone()
print('Total: ', res[0])

ドキュメント: Database.execute_sql

26
coleifer