【问题标题】:How to get a large amount of data from the database and transfer it over http with one request?如何从数据库中获取大量数据并通过 http 进行一次请求传输?
【发布时间】:2021-04-20 20:49:43
【问题描述】:

在 Flask 应用程序中,我有一个包含事件的表,其中有很多,现在我需要制作一个将数据导出到 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

我在我的网站上实现了分页,所以没有问题,但是当尝试导出大量数据时,时间太长了。

我知道我可以创建一个任务来生成一个文件然后请求它,但如果可能的话我想不这样做。

作为数据库,我使用 MonogoDB 和 Mongoengine 进行连接。

【问题讨论】:

    标签: python-3.x flask mongoengine flask-mongoengine


    【解决方案1】:

    在处理大量文档时,MongoEngine 引入的开销可能太重要了。一种加快速度的方法是绕过 MongoEngine 并发送原始文档(由 pymongo 返回)。

    尝试:

    events = EventModel.objects(__raw__=query).as_pymongo().no_cache()
    

    缺点是这会给你 dict 而不是 EventModel 实例,但也许这对你的用例来说是可以接受的。

    默认情况下,MongoEngine 会缓存文档(如果您再次遍历查询集,它不会访问数据库),因此您最好使用 no_cache() 将其关闭,否则您可能会耗尽内存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2018-03-06
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多