Поддерживать отношения через внешний ключ при добавлении данных в таблицы с автоинкрементом - PullRequest
0 голосов
/ 05 февраля 2019

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