【发布时间】:2014-06-22 10:38:01
【问题描述】:
我正在构建一个烧瓶应用程序,它允许用户上传 CSV 文件(具有不同的列)、预览上传的文件、生成汇总统计信息、执行复杂的转换/聚合(有时通过 Celery 作业),然后导出修改后的数据。上传的文件正在被读入 pandas DataFrame,这让我可以优雅地处理大部分复杂的数据工作。
我希望这些 DataFrame 以及相关的元数据(上传时间、上传文件的用户 ID 等)保持不变,并可供多个用户传递到各种视图。但是,我不确定如何最好地将数据合并到我的 SQLAlchemy 模型中(我在后端使用 PostgreSQL)。
我考虑过的三种方法:
- 将 DataFrame 塞入
PickleType并将其直接存储在数据库中。这似乎是最直接的解决方案,但意味着我会将大型二进制对象粘贴到数据库中。 - 挑选DataFrame,将其写入文件系统,并将路径作为字符串存储在模型中。这样可以使数据库保持较小,但在备份数据库并允许用户执行删除之前上传的文件等操作时增加了一些复杂性。
- 将 DataFrame 转换为 JSON (
DataFrame.to_json()) 并将其存储为json类型(映射到 PostgreSQL 的json类型)。这增加了每次访问 DataFrame 时解析 JSON 的开销,但它也允许直接通过 PostgreSQL JSON operators 操作数据。
鉴于每种方法的优点和缺点(包括我不知道的那些),是否有将 pandas DataFrames 合并到 SQLAlchemy 模型中的首选方法?
【问题讨论】:
-
是否可以选择将每个数据帧本身写入单独的 postgresql 表? (使用
to_sqlpandas.pydata.org/pandas-docs/version/0.13.1/generated/…) -
嗯...我也可以尝试(使用自定义 to_sql 方法,因为 PostgreSQL 尚不支持)。我可以动态生成这些表的名称,并将它们与关联的元数据一起跟踪为单独的模型。然后,当我需要引用它时,我可以从该对象中提取表名并将其读回表中的数据框。我想知道与其他方法相比有什么优势?
-
sqlachemy 支持将在 14.0 版中提供给
to_sql(预计将在 2014 年 5 月的某个时间发布)。尚未在开发版中尝试过,但可能是一个有趣的选择。 -
确实,在开发版本中,PostgreSQL 将支持通过 sqlalchemy 写入 sql。所以你可以尝试开发版本,或者第一个候选版本可能会在下周发布。如果您只想存储数据,我认为您最好对不同选项进行一些比较(例如性能)。使用
to_sql,您当然具有能够直接访问postgresql 中数据的优势(查询部分数据帧、其他sql 操作等),但我不知道您是否需要。 -
你最后做了什么?
标签: python pandas flask sqlalchemy