SQLAlchemy跨数据库对同一表的透明访问
我在用MySQL和SQLAlchemy,有两个数据库,里面的表结构是一样的,但数据不同。数据库db1用来存放“热”数据,所以性能很好,而db2则用来存档。我不需要在这两个数据库之间进行联接,因为所有相关的数据都已经按需移动了。
每当我插入或更新新数据时,数据都会放进db1,而db2基本上是只读的,所以我只需要用两个引擎,提交时用db1的会话就可以了。不过,我想知道有没有简单的方法让SQLAlchemy可以自动从两个数据库查询数据,并把结果合并在一起?比如说,当我添加一行新数据时,它总是放到db1里,但当我用主键查询数据时,我希望它能同时在db1和db2的表中搜索,而不需要重新修改我代码里的所有查询。
1 个回答
2
你在寻找的是 水平分片 这个扩展,里面有一个示例用法,可以在 文档 中找到。这个扩展让你可以使用一个特别的 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
)