pandas - 将数据附加到具有自动增量的表时,通过外键维护关系
问题描述
假设我连续得到两个 pandas 数据帧,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
自动创建值?[在编辑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)
解决方案
推荐阅读
- c++ - Visual Studio 多字节已启用但未检测到
- c# - MVC- 检索 EditorFor 的原始值
- react-native - 在 React-native 中使用 Redux Toolkit 持久化存储
- ios - 预计解码字典
但找到了一个数组而不是 JSON SwiftUI - shell - ansible 从用户输入中读取 openssl 公钥 (.pem) 内容并在服务器上创建文件
- c - C语言中for循环的新形式?
- java - buildSrc:无法为 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象获取未知属性
- winforms - Click-Once 应用程序的用户可访问文件夹
- python - 在 python 中,这是做什么的: tan_y[:-1][np.diff(tan_y) < 0]
- svn - 搜索托管在 tigris.org 上的旧代码:svnwcrev-1.0.tar.gz