使用Python-Django将CSV文件导入PostgreSQL数据库

Mar*_*era 6 python django postgresql etl pygrametl

注意:向下滚动到背景部分以获取有用的详细信息.假设该项目使用Python-Django和South,如下图所示.

导入以下CSV的最佳方法是什么?

"john","doe","savings","personal"
"john","doe","savings","business"
"john","doe","checking","personal"
"john","doe","checking","business"
"jemma","donut","checking","personal"
Run Code Online (Sandbox Code Playgroud)

使用相关表Person,AccountAccountType考虑进入PostgreSQL数据库:

  1. 管理员用户可以通过自定义UI实时更改数据库模型和CSV导入表示
  2. 当常规用户导入CSV文件时,将使用保存的CSV到数据库表/字段映射

到目前为止,已经考虑了两种方法

  1. ETL-API方法:向目标数据库提供ETL API电子表格,我的CSV到数据库表/字段映射和连接信息.然后,API将加载电子表格并填充目标数据库表.看着pygrametl我不认为我的目标是可能的.事实上,我不确定任何ETL API都会这样做.
  2. 行级插入方法:解析CSV到数据库的表/字段映射,解析电子表格,并在"join-order"中生成SQL插入.

我实现了第二种方法,但我正在努力解决算法缺陷和代码复杂性问题.是否有一个python ETL API可以满足我的需求?还是一种不涉及重新发明轮子的方法?


背景

我工作的公司正在寻求将sharepoint中托管的数百个项目特定设计电子表格移动到数据库中.我们即将完成满足需求的Web应用程序,允许管理员为每个项目定义/建模数据库,在其中存储电子表格,以及定义浏览体验.在这个完成阶段,过渡到商业工具不是一种选择.将Web应用程序视为django-admin备选方案,尽管它不具备数据库建模UI,CSV导入/导出功能,可自定义浏览和模块化代码,以解决项目特定的自定义问题.

实施的CSV导入界面很麻烦且有问题,所以我试图获得反馈并找到替代方法.

Mar*_*era 0

我最终后退了几步,使用可更新的 SQL 视图按照奥卡姆剃刀原理解决了这个问题。这意味着一些牺牲:

  1. 删除:依赖 South.DB 的实时模式管理 API、动态模型加载和动态 ORM 同步
  2. 手动定义 models.py 和初始向南迁移。

这允许采用一种简单的方法将平面数据集 (CSV/Excel) 导入标准化数据库:

  1. 在 models.py 中为每个电子表格定义非托管模型
  2. 在最初的南迁移中,将它们映射到符合电子表格字段布局的可更新 SQL 视图(INSERT/UPDATE-INSTEAD SQL RULE)
  3. 迭代 CSV/Excel 电子表格行并执行INSERT INTO <VIEW> (<COLUMNS>) VALUES (<CSV-ROW-FIELDS>);