Как объединить несколько баз данных Postgres в одну, исключив повторяющиеся записи?

  • 8 сентября 2023 г. 12:37
Ответы на вопрос 2
Для объединения нескольких баз данных 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')
```

Это пример и может потребовать подстройки для вашей конкретной ситуации, но он демонстрирует основную идею объединения таблиц в одну и сохранения связей между ними.
[код пользователя] и [код строки] должны быть указаны в виде ключей при репликации в PostgreSQL. При удалении после слияния нужно учитывать приоритет пользователей.
Похожие вопросы