如何通过一次请求从数据库中获取大量数据并通过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() 将其关闭,否则您可能运行 内存不足