【问题标题】:SQL insert from two related csv files从两个相关的 csv 文件插入 SQL
【发布时间】:2014-12-08 03:51:59
【问题描述】:

我有一个场景,用户将一组 csv 文件上传到我的应用程序,其中表与一对多关系相关。

例子:

文件 1,人员:

ref, birthyear, gender, weight,
"L300", 1983, M, 65,
"L301", 1983, F, 78,

文件 2,活动:

ref, activityStart, activityEnd,
"L300", 31Aug2014 23:00, 01Sep2014 00:00,
"L300", 31Aug2014 23:30, 02Sep2014 00:00,
"L300", 01Sep2014 07:00, 03Sep2014 00:00,
"L301", 31Aug2014 19:00, 01Sep2014 00:00,
"L301", 31Aug2014 22:30, 01Sep2014 00:00,

活动和人员的主键都是自增整数,活动表有一个外键列 person_id。

目前我正在使用 SQLAlchemy ORM 创建实体,但是当记录数量很大时性能真的很差。

我想做的是在上传这些记录时生成插入这些记录所需的 SQL,但我在弄清楚如何处理外键时遇到了问题。我不能先插入人员,然后通过对“ref”列进行查询来获取“id”,因为“ref”列仅对当前文件集而不是整个数据库是唯一的。

我目前有一个 sqlite 数据库作为后端,但正在研究用于生产的 postgres。

我认为这应该是一个很常见的情况,我想知道是否有人对如何解决这个问题有任何好的想法?

【问题讨论】:

  • 通常你知道插入记录的PK(你从persons开始),比如sqlite中的last_insert_rowid(),然后用它来插入记录到活动中。还是您现在正在使用相同的想法并且对您来说非常慢?
  • 我希望运行一个大的 executemany 语句,但我会尝试这个选项,看看性能是否足够好。谢谢!

标签: python sqlite postgresql sqlalchemy


【解决方案1】:

我不确定如何在 SQLite 中解决,但在 Postgres 中,我认为您只需要使用 RETURNING IDclause 进行插入。来自关于插入的 PostgreSQL 文档:

在表distributors中插入一行,返回序列 DEFAULT 子句生成的数字:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

9.3 SQL Insert documementation

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2010-09-05
    • 1970-01-01
    • 2014-05-28
    • 2018-03-31
    • 2015-03-30
    相关资源
    最近更新 更多