Функция агрегации на нескольких базах данных в sqlalchemy - PullRequest
0 голосов
/ 17 января 2019

У меня есть две базы данных на сервере postgres, названные диспетчерской и драйверами, и я настроил это так:

engines = {    'drivers':create_engine('postgres://postgres:admin@localhost:5432/drivers'),    'dispatch':create_engine('postgres://postgres:admin@localhost:5432/dispatch')
}

а также у меня есть класс routingSession, который на основе объекта, переданного во время выполнения запроса, выполняет запрос в конкретной базе данных и извлекает результат

class RoutingSession(Session):
    def get_bind(self, mapper=None, clause=None):
        if mapper and issubclass(mapper.class_, drivers):
            return engines['drivers']
        elif mapper and issubclass(mapper.class_, dispatch):
            return engines['dispatch']

так что теперь я могу разместить запрос к таблицам базы данных следующим образом:

Session = sessionmaker(class_=RoutingSession)
session=Session()
res=session.query(drivers).all()

но проблема, с которой я сталкиваюсь, заключается в том, что мне нужно объединить результаты между двумя моими таблицами, то есть драйверами и диспетчеризацией, что я могу сделать при работе с одной и той же базой данных и несколькими схемами:

result=session.query(drivers,dispatch).filter(drivers.id==dispatch.id).all()

, но не удается, когда я пытаюсь сделать это на разных базах данных. Пожалуйста, предложите, как мне этого добиться.

1 Ответ

0 голосов
/ 21 января 2019

Оболочки сторонних данных - это хороший способ агрегирования на нескольких базах данных или серверах.

https://www.percona.com/blog/2018/08/21/foreign-data-wrappers-postgresql-postgres_fdw/

Иначе вы также можете использовать панд, используя панд, которые мы можем иметьнаши фреймы данных, а затем выполняем любые агрегации и манипуляции с фреймами данных. Хотя я не проводил тестирование производительности с использованием панд, но я предполагаю, что оно будет медленнее по сравнению с первым подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...