Domain driven design 如何在多个DDD存储库中有效地使用SQLAlchemy?

Domain driven design 如何在多个DDD存储库中有效地使用SQLAlchemy?,domain-driven-design,sqlalchemy,ddd-repositories,Domain Driven Design,Sqlalchemy,Ddd Repositories,我一直在寻找一些如何使用SQLAlchemy实现存储库模式的示例。具体来说,实现多个存储库 在多个存储库的情况下,我认为最好通过维护一个单独的SQLAlchemy会话来实现每个存储库。但是,我在尝试将绑定到一个会话的对象实例移动到另一个会话时遇到了一个问题 首先,这样做有意义吗?每个存储库是否应该与任何其他存储库分开维护自己的UoW,或者是否应该认为让整个上下文共享同一会话是安全的 其次,从一个会话中分离实例并将其绑定到另一个会话的最佳方法是什么 第三,是否有任何使用SQLAlchemy编写的可

我一直在寻找一些如何使用SQLAlchemy实现存储库模式的示例。具体来说,实现多个存储库

在多个存储库的情况下,我认为最好通过维护一个单独的SQLAlchemy会话来实现每个存储库。但是,我在尝试将绑定到一个会话的对象实例移动到另一个会话时遇到了一个问题

首先,这样做有意义吗?每个存储库是否应该与任何其他存储库分开维护自己的UoW,或者是否应该认为让整个上下文共享同一会话是安全的

其次,从一个会话中分离实例并将其绑定到另一个会话的最佳方法是什么


第三,是否有任何使用SQLAlchemy编写的可靠DDD存储库示例?

我不熟悉DDD存储库模式,但下面是一个exmaple,展示了如何将对象从一个会话移动到另一个会话:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

metadata  = MetaData()
Base = declarative_base(metadata=metadata, name='Base')

class Model(Base):
    __tablename__ = 'models'
    id = Column(Integer, primary_key=True)


engine1 = create_engine('sqlite://')
metadata.create_all(engine1)
engine2 = create_engine('sqlite://')
metadata.create_all(engine2)

session1 = sessionmaker(bind=engine1)()
session2 = sessionmaker(bind=engine2)()

# Setup an single object in the first repo.
obj = Model()
session1.add(obj)
session1.commit()
session1.expunge_all() 

# Move object from the first repo to the second.
obj = session1.query(Model).first()
assert session2.query(Model).count()==0
session1.delete(obj)
# You have to flush before expunging, otherwise it won't be deleted.
session1.flush()
session1.expunge(obj)
obj = session2.merge(obj)
# An optimistic way to bind two transactions is flushing before commiting.
session2.flush()
session1.commit()
session2.commit()
assert session1.query(Model).count()==0
assert session2.query(Model).count()==1

我实际上不需要从第一个会话中删除该对象(我相信这实际上会发出delete语句?),我只需要将其分离,以便可以将其添加到第二个会话中。如果这是我唯一的目标,我需要做什么?
session1.expunge(obj)
是将对象从会话中分离出来的行。我的代码将对象从一个数据库移动到另一个数据库。两个会话可能都需要一个引擎。