Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy对同一表accross数据库的透明访问_Python_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy对同一表accross数据库的透明访问

Python SQLAlchemy对同一表accross数据库的透明访问,python,sqlalchemy,Python,Sqlalchemy,我使用的是MySQL和SQLAlchemy,我有两个数据库,它们有相同的表,但数据不同。数据库db1用于“热”数据,因此具有更好的性能,db2用于存档。我永远不需要跨数据库执行联接,因为所有相关数据都会相应地移动 每当我插入或更新新数据时,它都会进入db1,db2基本上是只读的,所以对我来说,有两个引擎并在提交时使用db1会话很简单。但是,SQLAlchemy有没有简单的方法可以透明地从两者查询数据并合并结果?例如,当我添加新行时,它总是进入db1,但是当我使用主键查询一行时,我希望它搜索db1

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

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

您正在寻找扩展,在。这允许您使用一个特殊的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
)

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