Предположим, я последовательно получаю два фрейма данных панд 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
так, чтобы первичный ключ былпродолжить с существующих записей и далее?Я не могу заставить его работать с методом панд 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)