Python SQLAlchemy对同一表accross数据库的透明访问
我使用的是MySQL和SQLAlchemy,我有两个数据库,它们有相同的表,但数据不同。数据库db1用于“热”数据,因此具有更好的性能,db2用于存档。我永远不需要跨数据库执行联接,因为所有相关数据都会相应地移动 每当我插入或更新新数据时,它都会进入db1,db2基本上是只读的,所以对我来说,有两个引擎并在提交时使用db1会话很简单。但是,SQLAlchemy有没有简单的方法可以透明地从两者查询数据并合并结果?例如,当我添加新行时,它总是进入db1,但是当我使用主键查询一行时,我希望它搜索db1和db2中的表,而不必重构代码中的所有查询。您正在寻找扩展,在。这允许您使用一个特殊的ShardedSession,它使用各种分派函数来决定与哪个数据库进行对话Python SQLAlchemy对同一表accross数据库的透明访问,python,sqlalchemy,Python,Sqlalchemy,我使用的是MySQL和SQLAlchemy,我有两个数据库,它们有相同的表,但数据不同。数据库db1用于“热”数据,因此具有更好的性能,db2用于存档。我永远不需要跨数据库执行联接,因为所有相关数据都会相应地移动 每当我插入或更新新数据时,它都会进入db1,db2基本上是只读的,所以对我来说,有两个引擎并在提交时使用db1会话很简单。但是,SQLAlchemy有没有简单的方法可以透明地从两者查询数据并合并结果?例如,当我添加新行时,它总是进入db1,但是当我使用主键查询一行时,我希望它搜索db1
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
)
是否有不使用主/从数据库复制的原因?这似乎是一个完美的解决方案。在ORM/应用程序级别执行此操作似乎很笨拙,与复制无关。数据库具有相同的模式,但数据不同。