繁体   English   中英

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

[英]Importing a CSV file into a PostgreSQL DB using Python-Django

注意:向下滚动到“ 背景”部分以获取有用的详细信息。 在下图中,假设项目使用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的替代方案,尽管不是,但它具有数据库建模UI,CSV导入/导出功能,可自定义的浏览功能以及用于解决特定于项目的自定义的模块化代码。

实施的CSV导入界面既麻烦又有错误,因此我正在尝试获取反馈并找到替代方法。

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

创建一个Person类,该类代表数据库中的一个人。 这可以使用Django的ORM,也可以对其进行扩展,或者您可以自己进行。

现在您有两个问题:

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

现在,您不仅拥有CSV到数据库的功能,还拥有CSV到人员的功能和Person-to-Database的功能。 我认为从概念上讲这更干净。 当管理员更改架构时,这将更改“人员到数据库”端。 当管理员更改CSV格式时,他们正在更改CSV到数据库端。 现在您可以分别处理它们。

这有帮助吗?

我几乎每个月都在工作中编写导入子系统,并且随着我之前执行django-data-importer编写的大量任务的完成, 该导入程序的工作方式类似于django表单,并且具有CSV,XLS和XLSX文件的阅读器,可为您提供字典列表。

使用data_importer阅读器,您可以将文件读取到字典列表,并使用for和save行do DB对其进行迭代。 使用importer,您可以执行相同的操作,但是可以验证行中的每个字段,记录错误和操作,并在最后保存它。

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

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

最后,我使用可更新的SQL视图,为Occam的剃刀采取了一些措施来解决此问题。 这意味着一些牺牲:

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

这允许将平面数据集(CSV / Excel)导入规范化数据库的简单方法:

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

这是我在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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM