여러 DDD 리포지토리와 함께 SQLALCHEMY를 효과적으로 사용하려면 어떻게해야합니까?
-
21-09-2019 - |
문제
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
제휴하지 않습니다 StackOverflow