python - 将单个 Pandas 数据帧导出到多个 SQL 表(自动规范化)

标签 python sql pandas dataframe

我有一个这样的 DataFrame,但有数百万行和大约 15 列:

       id    name  col1   col2  total
0 8252552 CHARLIE DESC1 VALUE1   5.99
1 8252552 CHARLIE DESC1 VALUE2  20.00
2 5699881    JOHN DESC1 VALUE1  39.00
2 5699881    JOHN DESC2 VALUE3  -3.99
DataFrame 需要导出到 SQL 数据库中的多个表中。我目前正在使用 SQLite3 来测试功能。这些表将是:
  • 主要 ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, people_id INTEGER, col1_id INTEGER, col2_id INTEGER, total REAL )
  • 人 ( id INTEGER NOT NULL PRIMARY KEY UNIQUE, name TEXT UNIQUE )
  • col1 ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT UNIQUE )
  • col2 ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT UNIQUE )

  • 主表应类似于以下内容:
      people_id col1_id col2_id  total
    0   8252552       1       1   5.99
    1   8252552       1       2  20.00
    2   5699881       1       1  39.00
    3   5699881       2       3  -3.99
    
    其他表,比如“people”,像这样:
         id    name
    8252552 CHARLIE
    5699881    JOHN
    
    问题是,我找不到如何使用 schema 来实现这一点。 to_sql 的属性 Pandas 中的方法。使用 Python,我会做这样的事情:
    conn = sqlite3.connect("main.db")
    cur = conn.cursor()
    for row in dataframe:
        id = row["ID"]
        name = row["Name"]
        col1 = row["col1"]
        col2 = row["col2"]
        total = row["total"]
        cur.execute("INSERT OR IGNORE INTO people (id, name) VALUES (?, ?)", (id, name))
        people_id = cur.fetchone()[0]
        cur.execute("INSERT OR IGNORE INTO col1 (col1) VALUES (?)", (col1, ))
        col1_id = cur.fetchone()[0]
        cur.execute("INSERT OR IGNORE INTO col1 (col2) VALUES (?)", (col2, ))
        col2_id = cur.fetchone()[0]
        cur.execute("INSERT OR REPLACE INTO main (people_id, col1_id, col2_id, total) VALUES (?, ?, ?, ?)", (people_id, col1_id, col2_id, total ))
    conn.commit()
    
    这会自动将相应的值添加到表(人员、col1 和 col2)中,使用所需的值和外键创建一行,然后将该行添加到主表中。但是,有很多列和行,这可能会变得很慢。另外,我不太相信这是处理数据库时的“最佳实践”(我对数据库开发还很陌生)
    我的问题是:有没有办法将 Pandas DataFrame 导出到多个 SQL 表,设置规范化规则,如上例所示?有没有办法获得相同的结果,并提高性能?

    最佳答案

    您能否先根据数据库表将您的 Pandas 数据框拆分为多个子数据框,然后应用 to_sql()每个子数据帧的方法?

    关于python - 将单个 Pandas 数据帧导出到多个 SQL 表(自动规范化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63696859/

    相关文章:

    Python: SSL.Context(SSL.SSLv3_METHOD) = 没有这样的协议(protocol)

    mysql - 如何检查字段是否有其他字段的串联字符串?

    python - 索引出现最接近的 5 个索引列表

    python - 如何使用 Keras 对张量的每个元素使用 scipy 函数?

    python - python中的selenium通过相对xpath查找元素

    python - 安装了 Nose 但不能在命令行上使用

    带有左外连接的 MySQL 查询无法加载

    php - 显示来自数据库的数据的通知和警告

    python - 计算 Pandas 中具有相同列值的行的平均值

    python - pandas 多种条件下的新操作栏