2013-03-18 80 views
6

注意:向下滚动到背景部分以获取有用的详细信息。假设该项目使用Python-Django和South,如下图所示。使用Python-Django将CSV文件导入PostgreSQL数据库

什么是与相关表导入以下CSV

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

进入PostgreSQL数据库帐户ACCOUNTTYPE考虑的最佳方式:

  1. 管理员用户可以更改数据库当普通用户导入CSV文件

到目前为止,两种方法已经通过自定义UI

  • 保存的CSV到数据库表/字段映射实时SE车型和CSV导入,表示使用考虑

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

    我实现了第二种方法,但我正在努力应对算法缺陷和代码复杂性。有没有一个python的ETL API可以做我想要的?还是一种不涉及重新发明轮子的方法?


    背景

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

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

  • +0

    我认为你应该解决这个问题。提取一个您正在查找并发布的最小示例。也就是说,编写一个csv示例数据并规范化所需的目标模式。 – danihp

    +0

    感谢您的建议。希望这会得到更多关注。现在改变标题顺便说一句。 –

    +0

    这个问题仍然没有意义。设计一个模式,放在那里,使用它 - 这是一个三线程和/或psql'调用。 –

    回答

    0

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

    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>);
    2

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

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

    现在你有两个问题:

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

    现在,您不仅具有CSV到数据库,还具有CSV到个人和个人到数据库。我认为这在概念上更清洁。当管理员更改架构时,会更改“个人数据库”一侧。当管理员更改CSV格式时,他们正在更改CSV到数据库方面。现在你可以单独处理每一个。

    这有帮助吗?

    +0

    由于整个模型是动态的,因此人员将成为许多动态创建的对象之一;不只是领域,表格也是如此。由于每个对象都是一个实例,并且对象在层次上相关,所以持久性会在树的每个“步骤”处要求行级插入。这绝对值得考虑,并且与行级插入方法非常相似。 –

    +0

    希望我可以把赏金提高到100给予更好的激励 –

    +0

    为什么你有要求管理员可以完全改变架构?也许知道这会帮助我思考一些事情。 – Claudiu

    0

    我几乎每个月都会在工作中编写导入子系统,因为我做了很多类似于我前段时间写的django-data-importer的任务。该导入程序的工作方式类似于django表单,并且具有CSV,XLS和XLSX文件的读者,可以为您提供字典列表。

    有了data_importer阅读器,你可以阅读文件列表中的字典,iter上有for和save线做DB。 有了导入程序,您可以做同样的事情,但可以验证每一行的字段,记录错误和操作,并在最后保存。请致电https://github.com/chronossc/django-data-importer。我敢肯定,它会解决你的问题,并会帮助你从任何类型的CSV文件的过程从现在:)

    为了解决您的问题,我建议使用数据导入与芹菜任务。您可以通过简单的界面上传文件并激活导入任务。 Celery任务将文件发送到导入程序,您可以验证线路,保存线路,记录错误。通过一些努力,您甚至可以为上传表格的用户呈现任务进度。

    +0

    现在看它 –

    +1

    我需要解决的问题是如何基于定义每个字段所属的表以及这些表是如何关联的映射,智能地将整个CSV数据集提交给数据库。您的进口商可以为实现_Row级别插入方法做出更清晰的实施。 –

    +0

    进口商在这一点上可能没有帮助,因为它期望定义的字段范围,但data_importer.readers将有所帮助。由于它保存了一些将每行代码作为字典返回的代码,因此您可以为自己设置一个字典,如{'fieldname':,...},并在dict itens循环中调用functions_dict [fieldname](fieldvalue,row)。该功能可以保存在正确的地方,下面是一个例子:https://gist.github.com/chronossc/5208763 您可以使用仅对实例赋值归属的函数并在保存实例之后对其进行改进。 – chronossc

    0

    这是我在github上找到的另一种方法。基本上它检测模式并允许覆盖。它的整个目标是生成由sql和/或任何驱动程序执行的原始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创建主键)和合并的选项/转储。