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

时间:2013-03-18 05:15:20

标签: 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"

考虑到

,使用相关表 Person Account AccountType 进入PostgreSQL数据库>
  1. 管理员用户可以通过自定义UI实时更改数据库模型和CSV导入表示
  2. 常规用户导入CSV文件时使用保存的CSV到数据库表/字段映射
  3. 到目前为止,已经考虑了两种方法

    1. ETL-API方法:向目标数据库提供ETL API电子表格,我的CSV到数据库表/字段映射和连接信息。然后,API将加载电子表格并填充目标数据库表。看着pygrametl我不认为我的目标是可能的。事实上,我不确定任何ETL API都会这样做。
    2. 行级插入方法:解析CSV到数据库的表/字段映射,解析电子表格,并在“join-order”中生成SQL插入。
    3. 我实现了第二种方法,但我正在努力解决算法缺陷和代码复杂性问题。是否有一个python ETL API可以满足我的需求?或者一种不涉及重新发明轮子的方法?


      背景

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

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

4 个答案:

答案 0 :(得分:2)

如何将问题分成两个独立的问题?

创建一个代表数据库中人员的Person类。这可以使用Django的ORM,或者扩展它,或者你可以自己做。

现在你有两个问题:

  1. 从CSV中的一行创建Person实例。
  2. Person实例保存到数据库。
  3. 现在,您不再使用CSV到数据库,而是拥有CSV到人员和人员到数据库。我认为这在概念上更清洁。当管理员更改架构时,会更改“人员到数据库”端。当管理员更改CSV格式时,他们正在更改CSV到数据库端。现在你可以单独处理每个。

    这对你有帮助吗?

答案 1 :(得分:0)

我几乎每个月都会在工作中编写导入子系统,因为我做了那么多我以前写过的任务django-data-importer。此导入器的工作方式类似于django表单,并且具有CSV,XLS和XLSX文件的读者,可以为您提供dicts列表。

使用data_importer阅读器,您可以将文件读取到dicts列表,iter就可以使用for和save line do DB。 使用导入器,您可以执行相同操作,但可以验证每个行的字段,记录错误和操作,并在结束时保存它。

请看一下https://github.com/chronossc/django-data-importer。我很确定它会解决你的问题,并且从现在起将帮助你处理任何类型的csv文件:)

为了解决您的问题,我建议将数据导入器与芹菜任务一起使用。您可以通过简单的界面上传文件并触发导入任务。 Celery任务会将文件发送给导入器,您可以验证行,保存,记录错误。通过一些努力,您甚至可以为上传工作表的用户提供任务进度。

答案 2 :(得分:0)

我最后采取了一些步骤来使用可更新的SQL视图来解决每个Occam剃刀的问题。这意味着一些牺牲:

  1. 删除:依赖于South.DB的实时架构管理API,动态模型加载和动态ORM同步
  2. 手动定义models.py和初始南迁移。
  3. 这允许将平面数据集(CSV / Excel)导入标准化数据库的简单方法:

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

答案 3 :(得分:0)

这是我在github上找到的另一种方法。基本上它检测模式并允许覆盖。它的整个目标是生成由psql和/或任何驱动程序执行的原始sql。

https://github.com/nmccready/csv2psql

  % python setup.py install
  % csv2psql --schema=public --key=student_id,class_id example/enrolled.csv > enrolled.sql
  % psql -f enrolled.sql

还有很多选项可用于更改(从许多现有cols创建主键)和合并/转储。