如何通过一次请求从数据库中获取大量数据并通过http传输?
How to get a large amount of data from the database and transfer it over http with one request?
在 Flask 应用程序中,我有一个 table 事件,事件数量很多,现在我需要制作一个将数据导出到 CSV 的函数:
@events.route('/events/get_events', methods=['POST', 'GET'])
def get_transactions():
query = {}
events = EventModel.objects(__raw__=query).all()
@stream_with_context
def generate_io_csv(header, items):
data = StringIO()
csw_writer = csv.writer(
data, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
csw_writer.writerow(header)
yield data.getvalue()
data.seek(0)
data.truncate(0)
for item in items:
csw_writer.writerow((
item.date,
item.user,
item.data,
))
yield data.getvalue()
data.seek(0)
data.truncate(0)
header = ('date', 'user', 'data')
response = Response(generate_io_csv(header, events), mimetype='text/csv')
response.headers.set('Content-Disposition', 'attachment', filename='data.csv')
return response
我在我的网站上实现了分页,所以没有问题,但是当尝试导出大量数据时需要很长时间。
我知道我可以创建一个任务来生成一个文件然后请求它,但如果可能的话我想不用它。
作为DB,我使用MonogoDB和Mongoengine进行连接。
当操作大量文档时,MongoEngine 引入的开销可能太重要了。加快速度的一种方法是绕过 MongoEngine 并发送原始文档(由 pymongo 返回)。
试试:
events = EventModel.objects(__raw__=query).as_pymongo().no_cache()
缺点是这会给你 dict 而不是 EventModel 实例,但也许这对于你的用例来说是可以接受的。
默认情况下,MongoEngine 会缓存文档(如果您再次遍历查询集,它不会访问数据库),所以您最好使用 no_cache()
将其关闭,否则您可能运行 内存不足
在 Flask 应用程序中,我有一个 table 事件,事件数量很多,现在我需要制作一个将数据导出到 CSV 的函数:
@events.route('/events/get_events', methods=['POST', 'GET'])
def get_transactions():
query = {}
events = EventModel.objects(__raw__=query).all()
@stream_with_context
def generate_io_csv(header, items):
data = StringIO()
csw_writer = csv.writer(
data, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
csw_writer.writerow(header)
yield data.getvalue()
data.seek(0)
data.truncate(0)
for item in items:
csw_writer.writerow((
item.date,
item.user,
item.data,
))
yield data.getvalue()
data.seek(0)
data.truncate(0)
header = ('date', 'user', 'data')
response = Response(generate_io_csv(header, events), mimetype='text/csv')
response.headers.set('Content-Disposition', 'attachment', filename='data.csv')
return response
我在我的网站上实现了分页,所以没有问题,但是当尝试导出大量数据时需要很长时间。
我知道我可以创建一个任务来生成一个文件然后请求它,但如果可能的话我想不用它。
作为DB,我使用MonogoDB和Mongoengine进行连接。
当操作大量文档时,MongoEngine 引入的开销可能太重要了。加快速度的一种方法是绕过 MongoEngine 并发送原始文档(由 pymongo 返回)。
试试:
events = EventModel.objects(__raw__=query).as_pymongo().no_cache()
缺点是这会给你 dict 而不是 EventModel 实例,但也许这对于你的用例来说是可以接受的。
默认情况下,MongoEngine 会缓存文档(如果您再次遍历查询集,它不会访问数据库),所以您最好使用 no_cache()
将其关闭,否则您可能运行 内存不足