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

Python 将单个数据帧导出到多个SQL表(自动规范化),python,sql,pandas,dataframe,Python,Sql,Pandas,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数据库中。我目前正在使用

我有一个这样的数据框,但有数百万行和大约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来测试功能。这些表格将是:

  • main(
    id INTEGER非空主键自动递增唯一、people\u id INTEGER、col1\u id INTEGER、col2\u id INTEGER、total REAL
  • 人员(
    id整数非空主键唯一,名称文本唯一
  • col1(
    id INTEGER NOT NULL主键自动递增唯一,名称文本唯一
  • col2(
    id INTEGER NOT NULL主键自动递增唯一,名称文本唯一
主表应类似于此:

  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
其他表格,如“人”,如下所示:

     id    name
8252552 CHARLIE
5699881    JOHN
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()
问题是,我找不到如何使用pandas中
to_sql
方法的
schema
属性来实现这一点。使用Python,我将执行以下操作:

     id    name
8252552 CHARLIE
5699881    JOHN
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),创建一个包含期望值和外键的行,并将该行添加到主表中。但是,有很多列和行,这可能会变得非常缓慢。另外,我不认为这是处理数据库时的“最佳实践”(我对数据库开发相当陌生)


我的问题是:是否有一种方法可以将一个数据帧导出到多个SQL表,并设置规范化规则,如上例所示?有没有办法在性能提高的情况下获得相同的结果?

您是否可以先根据数据库表将Pandas数据帧拆分为几个子数据帧,然后在每个子数据帧上应用
to_sql()
方法?

是的,这是一个选项。但是我如何改变这些值并使其正常化呢?