7

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

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

"john","doe","savings","personal"
"john","doe","savings","business"
"john","doe","checking","personal"
"john","doe","checking","business"
"jemma","donut","checking","personal"

进入具有相关表PersonAccountAccountType的 PostgreSQL 数据库,考虑:

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

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

  1. ETL-API 方法:为 ETL API 提供电子表格、我的 CSV 到数据库的表/字段映射以及到目标数据库的连接信息。然后 API 将加载电子表格并填充目标数据库表。看着 pygrametl 我不认为我的目标是可能的。事实上,我不确定是否有任何 ETL API 可以做到这一点。
  2. 行级插入方法:解析 CSV 到数据库的表/字段映射,解析电子表格,并以“连接顺序”生成 SQL 插入。

我实现了第二种方法,但在算法缺陷和代码复杂性方面苦苦挣扎。那里有没有我想要的python ETL API?还是一种不涉及重新发明轮子的方法?


背景

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

实现的 CSV 导入界面既麻烦又麻烦,所以我试图获得反馈并找到替代方法。

4

4 回答 4

2

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

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

现在你有两个问题:

  1. 从 CSV 中的一行创建一个Person实例。
  2. Person将实例保存到数据库。

现在,不仅仅是 CSV-to-Database,您还拥有 CSV-to-Person 和 Person-to-Database。我认为这在概念上更清洁。当管理员更改架构时,会更改人员到数据库端。当管理员更改 CSV 格式时,他们正在更改 CSV-to-Database 端。现在你可以分别处理每一个。

这有帮助吗?

于 2013-03-20T16:17:06.227 回答
0

我几乎每个月都在工作中编写导入子系统,并且当我执行此类任务时,我之前写过很多 django-data-importer。这个导入器像 django 表单一样工作,并且具有 CSV、XLS 和 XLSX 文件的阅读器,可为您提供字典列表。

使用 data_importer 阅读器,您可以将文件读取到 dicts 列表中,并使用 for 和 save 行进行数据库迭代。使用导入器,您可以做同样的事情,但可以验证行的每个字段,记录错误和操作,并在最后保存。

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

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

于 2013-03-20T17:53:02.403 回答
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>);
于 2013-03-26T04:58:12.487 回答
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

还有很多选项可以进行更改(从许多现有的列创建主键)和合并/转储。

于 2014-10-31T01:11:27.317 回答