假设我连续获得两个熊猫数据帧,df_base
和df_referencing
。两者都有标准的数值索引,其值为0,1,2,...
。 df_referencing
的列base_id
引用了df_base
的索引-以数据库的形式,这就是外键。
每次获得这些新数据框时,我都希望将它们附加到相应的sqlite表中
CREATE TABLE base_table (
"ID" INTEGER PRIMARY KEY AUTOINCREMENT,
"COL1" FLOAT,
"COL2" FLOAT);
CREATE TABLE referencing_table (
"ID" INTEGER PRIMARY KEY AUTOINCREMENT,
"COL1" FLOAT,
"COL2" FLOAT,
"BASE_ID" INTEGER,
FOREIGN KEY(BASE_ID) REFERENCES base_table(ID));
我有以下两个问题:
df_base
和df_referencing
,以便从现有记录开始继续使用主键?我无法使其与pandas方法to_sql
一起使用。我是否必须编写自己的sql命令,例如INSERT INTO base_table (COL1, COL2) VALUES ('0.736252', '0.709897');
会自动创建ID
值吗? [我自己在Edit 1中回答了问题] referencing_table
时要创建的主键来更新表base_table
中的外键?我的环境:Windows 10,python 3.7.0,pandas 0.24.0,sqlalchemy 1.2.16
也许有助于查看示例数据帧
import pandas as pd
import numpy as np
df_base = pd.DataFrame(np.random.rand(5,2), columns = ['COL1', 'COL2'])
df_referencing = pd.DataFrame(np.random.rand(10,2), columns = ['COL1', 'COL2'])
df_referencing['base_id'] = [0,0,1,1,2,2,3,3,4,4]
print(df_base)
print(df_referencing)
# df_base
COL1 COL2
0 0.736252 0.709897
1 0.846635 0.372465
2 0.360253 0.302076
3 0.695931 0.407356
4 0.800489 0.070650
# df_referencing
COL1 COL2 base_id
0 0.529504 0.951910 0
1 0.407145 0.321576 0
2 0.685721 0.488690 1
3 0.943426 0.961819 1
4 0.355398 0.299547 2
5 0.118759 0.234632 2
6 0.243048 0.585558 3
7 0.117997 0.957484 3
8 0.792215 0.596002 4
9 0.265951 0.656986 4
编辑1:
我必须纠正自己:to_sql
尊重AUTOINCREMENT
属性,如果我通过index=False
。
import pandas as pd
import numpy as np
import sqlalchemy
import os
# create sample data
df_base = pd.DataFrame(np.random.rand(5,2), columns = ['COL1', 'COL2'])
df_referencing = pd.DataFrame(np.random.rand(10,2), columns = ['COL1', 'COL2'])
df_referencing['base_id'] = [0,0,1,1,2,2,3,3,4,4]
print(df_base)
print(df_referencing)
# establish connection
engine = sqlalchemy.create_engine('sqlite:////'+os.getcwd()+'test.db')
# write to db
df_base.to_sql('base_table', con=engine, if_exists='append', index=False)
df_base_read = pd.read_sql_table('base_table', con=engine)
print(df_base_read)