SQLAlchemy跨数据库透明访问同一​​个表

时间:2014-07-09 20:46:23

标签: python sqlalchemy

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

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

1 个答案:

答案 0 :(得分:2)

您正在寻找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
)