Как импортировать денормализованые данные из 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])