使用自动增量将数据追加到表时,通过外键维护关系

时间:2019-02-05 17:21:10

标签: pandas sqlite sqlalchemy

假设我连续获得两个熊猫数据帧,df_basedf_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_basedf_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)

0 个答案:

没有答案