Python:与复杂数据仓库互动

10 投票
3 回答
3666 浏览
提问于 2025-04-16 04:31

我们花了很多力气建立了一个完整的数据库模型,现在是时候开始编写代码了。我们之前的项目都是通过手动拼接字符串来写查询语句。

请问在Python和复杂的数据库结构之间,有没有什么最佳或标准的做法呢?

我简单看了一下SQLAlchemy、SQLObject和Django-ORM,但(我可能遗漏了什么)它们似乎更适合处理小型的网页交易(OLTP),而我需要的是处理大量分析性交易(OLAP)。

我有一些需求,可能和一般情况有点不同:

  1. 能够相对快速地加载大量数据
  2. 能够快速简单地更新或插入少量数据
  3. 能够轻松处理大量行数据(每分钟300条,持续5年)
  4. 允许对数据库结构进行修改,以满足未来的需求

写这些查询语句很简单,但为了把数据整理好而写的代码却很繁琐,尤其是当数据库结构不断变化时。这似乎是计算机擅长的事情吧?

3 个回答

2

SQLAlchemy绝对是最好的。跟SQLAlchemy比起来,其他的ORM(对象关系映射工具)都像小孩子的玩具。尤其是Django的ORM。就像Hibernate是Java的标配,SQLAlchemy就是Python的标配。

3

我在使用SQLAlchemy处理一个比较大的数据仓库,并且成功地完成了整个ETL(提取、转换、加载)过程。特别是在一些数据源中,我有一些复杂的转换规则,或者是一些不同类型的数据源(比如网络服务)。我没有使用SQLAlchemy的ORM(对象关系映射),而是用它的SQL表达语言,因为在ETL过程中我并不需要把数据映射成对象。值得一提的是,当我需要直接复制某些数据源时,我更倾向于使用数据库工具,比如PostgreSQL的备份工具,这样更有效率。

SQL表达语言是你在使用SQLAlchemy(或者任何ORM)时,最接近手写SQL的方式。不过,由于你可以通过Python程序生成SQL,这样可以节省时间,特别是当你需要遵循一些非常复杂的转换规则时。

不过有一点,我更喜欢手动修改我的数据库结构。我不太信任任何工具来完成这个工作。

6

不要被你的需求搞混了。并不是所有的情况都适用同一种解决方案。

快速加载大量数据

为什么不直接使用数据库自带的加载工具呢?可以用Python来准备文件,但加载数据时最好用数据库的工具。你会发现这样速度非常快。

快速简单地更新或插入少量数据

这就有点偏离数据仓库的规则了。除非你是在说主数据管理,用来更新某个维度的报告属性。

这就是ORM(对象关系映射)和网络框架的用武之地。

轻松处理大量数据行(比如每分钟300条,持续5年)

所以你需要用Python来做前端处理,但实际的插入操作还是要用数据库工具来完成,而不是用Python。

轻松修改架构(连同Python接口),以应对未来的需求

你几乎不需要自动化这个过程。这绝对是你“编程”中优先级最低的任务。为了正确保存数据,你通常会手动进行这些操作。

顺便说一下,“通过字符串操作构建的手工查询”可能是最大的错误。这种查询对关系数据库管理系统(RDBMS)的解析器来说很难处理——它们的速度比使用绑定变量的查询要慢。

撰写回答