【问题标题】:Export single pandas dataframe to multiple SQL tables (automatic normalization)将单个 pandas 数据帧导出到多个 SQL 表(自动规范化)
【发布时间】:2020-12-21 02:39:49
【问题描述】:

我有一个这样的 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

问题是,我找不到如何使用 pandas 中 to_sql 方法的 schema 属性来实现这一点。使用 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()

这会自动将相应的值添加到表中(people、col1 和 col2),使用期望值和外键创建一行,并将该行添加到主表中。但是,有很多列和行,这可能会变得非常慢。另外,在处理数据库时,我不太确定这是“最佳实践”(我对数据库开发还很陌生)

我的问题是:有没有办法将 pandas DataFrame 导出到多个 SQL 表,设置规范化规则,如上例所示?有什么方法可以得到相同的结果并提高性能?

【问题讨论】:

    标签: python sql pandas dataframe


    【解决方案1】:

    能否先将你的 Pandas 数据框根据数据库表拆分成若干个子数据框,然后对每个子数据框应用to_sql() 方法?

    【讨论】:

    • 是的,这是一种选择。但是我将如何更改这些值并将其标准化?
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2023-02-05
    • 2015-11-13
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多