Python:与复杂数据仓库互动
我们花了很多力气建立了一个完整的数据库模型,现在是时候开始编写代码了。我们之前的项目都是通过手动拼接字符串来写查询语句。
请问在Python和复杂的数据库结构之间,有没有什么最佳或标准的做法呢?
我简单看了一下SQLAlchemy、SQLObject和Django-ORM,但(我可能遗漏了什么)它们似乎更适合处理小型的网页交易(OLTP),而我需要的是处理大量分析性交易(OLAP)。
我有一些需求,可能和一般情况有点不同:
- 能够相对快速地加载大量数据
- 能够快速简单地更新或插入少量数据
- 能够轻松处理大量行数据(每分钟300条,持续5年)
- 允许对数据库结构进行修改,以满足未来的需求
写这些查询语句很简单,但为了把数据整理好而写的代码却很繁琐,尤其是当数据库结构不断变化时。这似乎是计算机擅长的事情吧?
3 个回答
SQLAlchemy绝对是最好的。跟SQLAlchemy比起来,其他的ORM(对象关系映射工具)都像小孩子的玩具。尤其是Django的ORM。就像Hibernate是Java的标配,SQLAlchemy就是Python的标配。
我在使用SQLAlchemy处理一个比较大的数据仓库,并且成功地完成了整个ETL(提取、转换、加载)过程。特别是在一些数据源中,我有一些复杂的转换规则,或者是一些不同类型的数据源(比如网络服务)。我没有使用SQLAlchemy的ORM(对象关系映射),而是用它的SQL表达语言,因为在ETL过程中我并不需要把数据映射成对象。值得一提的是,当我需要直接复制某些数据源时,我更倾向于使用数据库工具,比如PostgreSQL的备份工具,这样更有效率。
SQL表达语言是你在使用SQLAlchemy(或者任何ORM)时,最接近手写SQL的方式。不过,由于你可以通过Python程序生成SQL,这样可以节省时间,特别是当你需要遵循一些非常复杂的转换规则时。
不过有一点,我更喜欢手动修改我的数据库结构。我不太信任任何工具来完成这个工作。
不要被你的需求搞混了。并不是所有的情况都适用同一种解决方案。
快速加载大量数据
为什么不直接使用数据库自带的加载工具呢?可以用Python来准备文件,但加载数据时最好用数据库的工具。你会发现这样速度非常快。
快速简单地更新或插入少量数据
这就有点偏离数据仓库的规则了。除非你是在说主数据管理,用来更新某个维度的报告属性。
这就是ORM(对象关系映射)和网络框架的用武之地。
轻松处理大量数据行(比如每分钟300条,持续5年)
所以你需要用Python来做前端处理,但实际的插入操作还是要用数据库工具来完成,而不是用Python。
轻松修改架构(连同Python接口),以应对未来的需求
你几乎不需要自动化这个过程。这绝对是你“编程”中优先级最低的任务。为了正确保存数据,你通常会手动进行这些操作。
顺便说一下,“通过字符串操作构建的手工查询”可能是最大的错误。这种查询对关系数据库管理系统(RDBMS)的解析器来说很难处理——它们的速度比使用绑定变量的查询要慢。