【问题标题】:How do I effectively use SQLAlchemy with multiple DDD Repositories?如何有效地将 SQLAlchemy 与多个 DDD 存储库一起使用?
【发布时间】:2011-01-17 14:31:15
【问题描述】:

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

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

首先,这样做有意义吗?每个 Repository 是否应该将自己的 UoW 与任何其他 Repository 分开,还是应该认为让整个上下文共享同一个 Session 是安全的?

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

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

【问题讨论】:

    标签: domain-driven-design sqlalchemy ddd-repositories


    【解决方案1】:

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

    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) 是从会话中分离对象的行。我的代码将对象从一个数据库移动到另一个数据库。您可能需要为两个会话使用一个引擎。
    猜你喜欢
    • 2014-02-03
    • 2011-03-17
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2013-06-06
    • 2015-03-20
    • 1970-01-01
    相关资源
    最近更新 更多