【问题标题】:Aggregation function on multiple databases in sqlalchemysqlalchemy中多个数据库的聚合函数
【发布时间】:2019-06-11 16:58:02
【问题描述】:

我在 postgres 服务器中有两个数据库,分别命名为 dispatch 和 drivers,并像这样配置它:

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()

但当我尝试在不同的数据库上执行此操作时失败。请建议我如何实现这一点。

【问题讨论】:

  • 你的问题是什么?
  • 更新了..请检查
  • 虽然感觉您应该使用架构,但正如您所指出的,如果您必须有单独的数据库,请尝试阅读外国数据包装器或 dblink。
  • @IljaEverilä 我能够在同一个数据库中使用模式来实现这一点,想测试我们是否可以通过多个数据库实现相同的目标。对于多个数据库,我也可以向两个数据库发起查询,但是不知道如何将两个不同查询的结果聚合在一起。
  • 似乎是重复的帖子stackoverflow.com/questions/44564369/… ..@IljaEverilä 您在此链接中发布的解决方案也适用于 postgres。

标签: python-3.x postgresql orm sqlalchemy


【解决方案1】:

外国数据包装器是在多个数据库或服务器上进行聚合的好方法。

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

或者你也可以使用 pandas,通过使用 pandas,我们可以拥有我们的数据帧,然后对数据帧进行任何类型的聚合和操作。虽然我没有使用 pandas 进行任何性能测试,但我假设它会更慢与第一种方法相比。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多