【问题标题】:SQLAlchemy transparent access to same table accross databasesSQLAlchemy 跨数据库对同一张表的透明访问
【发布时间】:2014-07-11 09:02:59
【问题描述】:

我正在使用 MySQL 和 SQLAlchemy,并且我有两个具有相同表但数据不同的数据库。数据库 db1 用于“热”数据,因此具有更好的性能,而 db2 用于存档。我永远不需要跨数据库执行连接,因为所有相关数据都会相应移动。

每当我插入或更新新数据时,它都会进入 db1,而 db2 基本上是只读的,所以我很容易拥有两个引擎并在我提交时使用一个 db1 会话。但是,SQLAlchemy 是否有任何简单的方法可以透明地从两者中查询数据并合并结果?例如,当我添加一个新行时,它总是进入 db1,但是当我使用主键查询一个时,我希望它搜索 db1 和 db2 中的表,而不必重构我的代码中的所有查询。

【问题讨论】:

  • 您不使用主/从数据库复制是否有原因?这似乎是一个完美的解决方案。在 ORM/app 级别执行此操作似乎很笨拙。
  • 它与复制无关。数据库具有相同的架构,但数据不同。

标签: python sqlalchemy


【解决方案1】:

您正在寻找Horizontal Sharding 扩展,documentation 中提供了一个示例用法。这允许您使用特殊的 ShardedSession,它使用各种调度函数来决定与哪个数据库通信。

def shard_chooser(mapper, instance, clause=None):
    """return a shard key based on the instance being handled"""

def id_chooser(query, ident):
    """return a shard key based on primary key"""

def query_chooser(query):
    """return a shard key based on the query"""

create_session = sessionmaker(class_=ShardedSession)
create_session.configure(
    shards={
        # map keys to engines
    },
    shard_chooser=shard_chooser,
    id_chooser=id_chooser,
    query_chooser=query_chooser
)

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2016-01-26
    相关资源
    最近更新 更多