我正在使用MySQL和SQLAlchemy,并且我有两个具有相同表但数据不同的数据库。数据库db1用于“热”数据,因此具有更好的性能,db2用于存档。我不需要跨数据库执行连接,因为所有相关数据都会相应地移动。
每当我插入或更新新数据时,它都会进入db1,而db2基本上是只读的,因此我很容易拥有两个引擎并在我提交时使用db1会话。但是,SQLAlchemy是否有任何简单的方法透明地从两者中查询数据并合并结果?例如,当我添加一个新行时,它总是进入db1,但是当我使用主键查询一行时,我希望它能够搜索db1和db2中的表,而不必重构代码中的所有查询。
答案 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
)