2017-10-19 40 views
0

Comment sqlalchemy gère le buffering/chunking?Comment interroger sqlalchemy en morceaux?

with open('out', 'w') as f: 
    query = table.select() 
    for row in engine.execute(query): 
     output_row = make_row_string(row) 
     print(output_row, file=f) 

lecture du ResultProxy docs Je déduis (à juste titre?) Qu'il est le traitement des lignes à la fois quand ils sont tous disponibles. Comment puis-je interroger et traiter en morceaux pour accélérer ce travail pour une requête à plusieurs lignes?

Les deux idées que j'ai pour traiter une requête à plusieurs rangées sont .fetchmany(chunksize) while True, ou itertools blocs. Quelle est la méthode recommandée pour obtenir plusieurs lignes d'une base de données distante?

Répondre

0

Vous pouvez éviter de charger l'ensemble d'une requête ResultSet en utilisant stream_results:

engine.execution_options(stream_results=True) 

Notez que les résultats en streaming ne seront probablement pas faire la requête plus vite - il ne fait que l'utiliser moins de mémoire. Notez également que si votre format de sortie est CSV, l'utilisation de COPY est beaucoup plus rapide.