Как импортировать денормализованые данные из CSV в PostgreSQL c сохранением отношений один ко многим

К примеру у меня есть 2 таблицы вида:

    1. Reporter
    reporter_id = int primary key autoincrement
    first_name = char(50)
    last_name = char(50)
    email = char(50)

    2. Article
    article_id = int primary key autoincrement
    headline = char(50)
    pub_date = char(50)
    reporter  = int references reporter(id) on update cascade on delete cascade

В CSV таблице эти данные соответственно в полях вида:

reporter_id , first_name, last_name, email, article_id, headline, pub_date, reporter_id

На данный момент научился импортировать с Pandas и SqlAlchemy таблицы без отношений:

import pandas as pd
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey

engine = create_engine('postgresql+psycopg2://postgres:password@localhost:5432/postgres')

data_from_csv = pd.read_csv(r'C:\data\data.csv', sep=';', names=headers)
data_from_csv.to_sql('common', engine, if_exists='append', index=False)

Как импортировать данные из CSV с помощью Pandas и ORM например SqlAlchemy, сохраняя отношения?


Ответы (1 шт):

Автор решения: MaxU

Можно прочитать из CSV нужный набор полей, удалить дубликаты и записать в БД:

def process_data(filename, engine, tab, **kwargs):
    df = pd.read_csv(filename, **kwargs).drop_duplicates()
    df.to_sql(tab, engine, if_exists='append', index=False)


process_data(filename, engine, 'reporter', sep=';', names=headers, usecols=[0,1,2,3])
process_data(filename, engine, 'article', sep=';', names=headers, usecols=[4,5,6,7])
→ Ссылка