Для объединения нескольких баз данных PostgreSQL в одну и исключения повторяющихся записей можно использовать следующий подход:
1. Создайте новую таблицу, в которую будут объединены данные из всех существующих таблиц.
2. Перенесите данные из каждой таблицы в новую таблицу, сохраняя связи между ними. Например, если в таблице "data_main" есть внешний ключ на таблицу "data_mainemail", добавьте столбец в новую таблицу для хранения этого значения и сохраните связь.
3. Удалите старые таблицы и переименуйте новую таблицу в подходящее имя.
Пример кода на Python с использованием SQLAlchemy:
```python
from sqlalchemy import create_engine, MetaData, Table
# Создание подключения к базам данных
data_main_engine = create_engine('postgresql://username:password@localhost:5432/data_main')
data_mainemail_engine = create_engine('postgresql://username:password@localhost:5432/data_mainemail')
data_mainphone_engine = create_engine('postgresql://username:password@localhost:5432/data_mainphone')
new_database_engine = create_engine('postgresql://username:password@localhost:5432/new_database')
# Создание метаданных для каждой таблицы
metadata = MetaData(bind=data_main_engine)
data_main_table = Table('data_main', metadata, autoload=True)
metadata = MetaData(bind=data_mainemail_engine)
data_mainemail_table = Table('data_mainemail', metadata, autoload=True)
metadata = MetaData(bind=data_mainphone_engine)
data_mainphone_table = Table('data_mainphone', metadata, autoload=True)
# Создание новой таблицы в новой базе данных
metadata = MetaData(bind=new_database_engine)
new_table = Table('new_table', metadata)
metadata.create_all()
# Выборка данных из каждой таблицы
data_main_query = data_main_table.select()
data_mainemail_query = data_mainemail_table.select()
data_mainphone_query = data_mainphone_table.select()
# Вставка данных в новую таблицу
new_table_data = []
with new_database_engine.connect() as connection:
data_main_results = connection.execute(data_main_query)
data_mainemail_results = connection.execute(data_mainemail_query)
data_mainphone_results = connection.execute(data_mainphone_query)
# Перенос данных из таблицы data_main
for row in data_main_results:
new_table_data.append({
'column_name': row.column_name,
'email': None, # Поле email из таблицы data_mainemail
'phone': None # Поле phone из таблицы data_mainphone
})
# Перенос данных из таблицы data_mainemail
for row in data_mainemail_results:
for new_row in new_table_data:
if new_row['column_name'] == row.column_name:
new_row['email'] = row.email
# Перенос данных из таблицы data_mainphone
for row in data_mainphone_results:
for new_row in new_table_data:
if new_row['column_name'] == row.column_name:
new_row['phone'] = row.phone
# Вставка данных в новую таблицу
connection.execute(new_table.insert(), new_table_data)
# Удаление старых таблиц
data_main_table.drop()
data_mainemail_table.drop()
data_mainphone_table.drop()
# Переименование новой таблицы
new_table.rename('data_combined')
```
Это пример и может потребовать подстройки для вашей конкретной ситуации, но он демонстрирует основную идею объединения таблиц в одну и сохранения связей между ними.