여러 DDD 리포지토리와 함께 SQLALCHEMY를 효과적으로 사용하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/2276523

문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top