Django 服务器和 prestodb 连接和数据分页
Posted
技术标签:
【中文标题】Django 服务器和 prestodb 连接和数据分页【英文标题】:Django server and prestodb connection and data pagination 【发布时间】:2020-05-28 20:09:36 【问题描述】:我有一个简单的基础架构,它使用 django 服务器作为 API 和 PrestoDb 作为查询引擎。一切对我来说都很好,但根据 prestodb,我几乎没有限制:
Prestodb 不支持分页,如何管理海量数据?将其加载到内存中的成本很高。 我为每个查询一次又一次地打开和关闭与 presto 的连接,仅使用一个或两个连接并在整个应用程序中使用它们的最佳方法是什么? 向用户显示错误而不是原始 presto 异常的正确方法是什么? 普通数据应该使用什么样的缓存机制? 我将 celery 用于后台作业,是否还有其他可用于运行未在 python 服务器上加载的后台作业? django 的最佳实践是什么?任何有用的链接?【问题讨论】:
【参考方案1】:这个问题很笼统,所以我只回答关于分页的部分。
Presto 支持通过 SQL 标准 OFFSET m FETCH NEXT n ROWS ONLY
语法或 OFFSET m LIMIT n
简化语法进行分页。
您可以在博文https://trino.io/blog/2020/02/03/beyond-limit-presto-meets-offset-and-ties.html 中阅读更多相关信息
当然,这主要适用于即席查询,或者当您无法改进实际查询结构时。对于计划查询或属于某些工作流(非临时)的查询,建议使用查询谓词(如果相关)而不是 OFFSET。在https://use-the-index-luke.com/sql/partial-results/fetch-next-page 上查看更多信息。
【讨论】:
【参考方案2】:首先,Presto 并非用于交易目的,而是用于分析目的,通常包含大量数据。在事务的情况下,由 Django ORM/Models 连接的 mysql/Postgres 是更好的选择。
不,它没有。根据here 和here,您必须获取所有数据,将其缓存在后端并进行查询。查询/过滤器应该非常特殊,以便获得少量感兴趣的数据。例如,考虑添加一个日期过滤器并将其限制为几天/几个月。这样可以限制用户不要进行繁重的查询。 如果您不需要不同的配置,例如事务隔离级别,您可以重复使用相同的连接 关于数据库错误,只需返回一个带有 500 代码的响应和内部错误消息。还要确保记录堆栈跟踪 Django 有一个开箱即用的caching framework Celery 是一个不错的选择,通常与 Redis 或 RabbitMQ 搭配使用。这些服务与主 Django 应用程序分开部署 Django docs 应该是一个好的开始【讨论】:
谢谢你的回复,你说的全取并缓存是什么意思?我应该获取所有数据并将其保存在 django 缓存中吗?如何重用连接?我对此感到困惑,我必须告诉用户出了什么问题,例如,如果表不存在,那么如何向用户显示正确的错误?这是其中一种情况,如果出现连接错误,我需要显示另一条消息等。我可以在 django 缓存中处理多少数据? Celery 确实是一个不错的选择,我正在将它与 redis 一起使用 - 完成谢谢 如果您的查询有 1000 个结果,请将它们全部提取到后端(在内存中或缓存中)并将其用于进一步的分页查询(第 2 页将带来 1000 个中的 51-100 个,所以更改页面时不再需要 presto) 例如,如果您使用的是github.com/prestodb/presto-python-client,请重用conn
对象。
使用不需要知道你的应用程序的内部结构。如果不是用户错误(例如,他输入了姓名而不是日期),他应该会收到一个通用错误,例如“使用此代码 xxx-xxx 联系您的管理员”。然后用户使用该代码联系支持,支持将查看日志以修复/解决问题。
内存中 Django 缓存适用于少量数据,但您可以将其连接到 Redis 进行大量处理 -> realpython.com/caching-in-django-with-redis以上是关于Django 服务器和 prestodb 连接和数据分页的主要内容,如果未能解决你的问题,请参考以下文章