Python:与复杂数据仓库交互

Python:与复杂数据仓库交互,python,django-models,sqlalchemy,data-warehouse,olap,Python,Django Models,Sqlalchemy,Data Warehouse,Olap,我们已经努力建立了问题的全维数据库模型,现在是开始编码的时候了。我们以前的项目使用了通过字符串操作构建的手工查询 python和复杂数据库布局之间的接口是否有最佳/标准实践 我已经简要地评估了SQLAlchemy、SQLObject和Django ORM,但是(我可能很容易遗漏一些东西)它们似乎是针对微小的web类型(OLTP)事务进行调整的,我正在进行大容量分析(OLAP)事务 我的一些要求可能与平时有所不同: 相对快速地加载大量数据 快速方便地更新/插入少量数据 轻松处理大量行(5年内每分钟

我们已经努力建立了问题的全维数据库模型,现在是开始编码的时候了。我们以前的项目使用了通过字符串操作构建的手工查询

python和复杂数据库布局之间的接口是否有最佳/标准实践

我已经简要地评估了SQLAlchemy、SQLObject和Django ORM,但是(我可能很容易遗漏一些东西)它们似乎是针对微小的web类型(OLTP)事务进行调整的,我正在进行大容量分析(OLAP)事务

我的一些要求可能与平时有所不同:

  • 相对快速地加载大量数据
  • 快速方便地更新/插入少量数据
  • 轻松处理大量行(5年内每分钟300个条目)
  • 允许在模式中进行修改,以满足未来的需求

  • 编写这些查询很容易,但是编写代码以获得所有排列的数据是很乏味的,尤其是随着模式的发展。这似乎是计算机可能擅长的事情?

    SQLAlchemy肯定是。与SQLAlchemy相比,所有其他的ORM看起来都像孩子的玩具。尤其是Django ORM。Hibernate对Java来说是什么,SQLAlchemy对Python来说是什么。

    不要被您的需求所迷惑。一个尺码不适合所有人

    相对快速地加载大量数据

    为什么不为此使用数据库的本机加载程序?使用Python准备文件,但使用数据库工具加载。你会发现这是惊人的快

    快速方便地更新/插入少量数据

    这开始扭曲数据仓库的规则。除非您讨论的是更新维度报告属性的主数据管理

    这就是ORM和web框架的用途

    轻松处理大量行(5年内每分钟300个条目)

    同样,这就是为什么使用Python前端处理管道,但实际的插入是由数据库工具完成的。不是Python

    根据未来的需求,轻松地更改模式(以及python接口)

    你几乎没有必要让它自动化。这当然是“编程”的最低优先级任务。为了正确保存数据,通常需要手动执行此操作


    顺便说一句,“通过字符串操作构建的手工查询”可能是有史以来最大的错误。RDBMS解析器很难处理这些问题——它们比使用插入了绑定变量的查询要慢。

    我将SQLAlchemy用于一个相当大的数据仓库,并成功地将其用于整个ETL过程。特别是在某些源中,我有一些复杂的转换规则,或者使用一些异构源(例如web服务)。我没有使用Sqlalchemy ORM,而是使用它的SQL表达式语言,因为我实际上不需要在ETL过程中映射任何对象。值得注意的是,当我带来一些源代码的逐字副本时,我宁愿使用db工具来实现这一点,比如PostgreSQL转储实用程序。你不能打败它。 SQL表达式语言是使用SQLAlchemy(或任何ORM)最接近手写SQL的语言,但由于您可以通过编程从python生成SQL,因此可以节省时间,特别是当您需要遵循一些非常复杂的转换规则时


    但有一件事,我宁愿手工修改我的模式。我不信任任何工具来完成这项工作。

    我将添加这一点作为评论,但通常情况下,ORM用于OLTP,试图将其强制用于映射数据仓库通常比它的价值更麻烦。虽然ORM可以用于OLTP,但它们也可以简化某些类型的数据仓库处理。大多数DW查询应该是简单的选择求和/计数和分组方式操作。由ORM工具生成这些查询可以节省大量时间。最终用户会生成查询吗?您提供了什么界面,以及什么级别的自由度?@shmichael:我尽可能多,但我们将从带有三维或四维值的下拉框开始。谢谢。我所说的“alter”是指“不要锁定模式”。很多时候,当与数据库交互时,您会达到要修改的代码行的某个阈值,此时不值得再编辑模式。如果可能的话,我希望完全避免这种情况。当加载到数据库中时,如何处理与旧数据重叠的新数据?还是每次只加载所有数据?这似乎效率太低了。@bukzor:datawarehouse(几乎总是)的意思是只插入。根据定义,新数据是新的,并且不与旧数据重叠。它可能共享一些公共密钥,但它是新的。请在继续之前找到Kimball的数据仓库工具包的副本。我上周收到了它,但我仍在阅读第2章。。。这是否意味着您总是从一个空白数据库开始?除此之外,至少我的一些数据将“重叠”:作业结束、机器升级等。我注意到,几乎所有缓慢变化的维度类型都需要更新旧数据以使其过期。@bukzor:“更新维度的报告属性”。我相信这就是正确SQL的用例。“你总是从一个空白数据库开始吗?”有点像。您通常提前知道尺寸。你很少事先知道事实。“工作结束了,机器升级了”听起来像是维度更新。这些都是小的、孤立的、专门的、稀有的东西。与事实加载不同,事实加载占数据库更改的80-90%。我已经尝试学习了三次SA ORM,每次都会遇到完全奇怪的错误,使我不想再接触它。你是怎么知道的?“完全奇怪的错误”或“我的假设结果是不真实的”?通常,我们做出假设,发现软件与我们的假设不符,并称整个事情为“怪异”。没有细节,就不可能做到