Pandas 使用autoincrement将数据追加到表时,通过外键维护关系
假设我依次得到两个panda数据帧,Pandas 使用autoincrement将数据追加到表时,通过外键维护关系,pandas,sqlite,sqlalchemy,Pandas,Sqlite,Sqlalchemy,假设我依次得到两个panda数据帧,df_base和df_referencement。两者都有标准的数值索引,其值0,1,2,…df_referencement有一列base_id,它引用df_base的索引——在数据库术语中,这将是外键 每次获得这些新数据帧时,我都希望将它们附加到相应的sqlite表中 CREATE TABLE base_table ( "ID" INTEGER PRIMARY KEY AUTOINCREMENT, "COL1" FLOAT, "COL2" FLO
df_base
和df_referencement
。两者都有标准的数值索引,其值0,1,2,…
df_referencement
有一列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
以使主键从现有记录开始继续?我无法让它与pandas方法df_referencement
。我是否必须编写自己的sql命令,例如,配合使用,以实现sql
INSERT INTO base_table(COL1,COL2)值('0.736252','0.709897')代码>哪个将自动创建
值?[在编辑1中自己回答了问题]ID
- 如何确保使用插入表
基表时创建的主键更新表
引用表中的外键
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:
我必须纠正自己:如果我通过index=False
,则sql
尊重自动增量
属性
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)
您是否尝试过
df\u base.to\u sql('base\u table',connection,index\u label='id')
和df\u referencement.to\u sql('referencement\u table',connection,index\u label='id')
我没有尝试过,因为第二次尝试附加数据帧时会弄乱索引,对吗?这是我第二次添加df_base
和df_reference
这些索引的记录。因此,我希望与主键属性发生冲突。@jhonnny是的,它不会像这样工作,如果您想坚持下去,我看到的唯一解决方案是拉取基于当前的_表,将其附加到df,然后增加最后一个索引。如果我是你,我会学习映射SQL表和使用SQL炼金术ORM@StevenG拉取整个当前的df_base
是不可行的,因为我的数据库将有数百万条记录。我不想显得懒惰,但你能详细说明你的建议吗?我不必拘泥于熊猫,只要数据最终到达它应该到达的地方。我想到的一种不雅观的方法是查询ID字段中最大的N
值,其中N
是我之前附加的记录数(我知道),然后使用base\u ID
列中基于df\u base
的值作为查找新ID的索引,构建更新后的base\u ID
。