我有一个这样的 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
) id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT UNIQUE
) 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/