Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 使用autoincrement将数据追加到表时,通过外键维护关系_Pandas_Sqlite_Sqlalchemy - Fatal编程技术网

Pandas 使用autoincrement将数据追加到表时,通过外键维护关系

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

假设我依次得到两个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" 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_referencement
    以使主键从现有记录开始继续?我无法让它与pandas方法
    配合使用,以实现sql
    。我是否必须编写自己的sql命令,例如,
    INSERT INTO base_table(COL1,COL2)值('0.736252','0.709897')哪个将自动创建
    ID
    值?[在编辑1中自己回答了问题]
  • 如何确保使用插入表
    基表时创建的主键更新表
    引用表中的外键
我的环境:Windows10、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:

我必须纠正自己:
如果我通过
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