Frage

Ich habe versucht, einige Beispiele zu finden, wie die Repository-Muster mit SQLAlchemy zu implementieren. Insbesondere die Umsetzung mehr als ein Repository.

Im Fall von mehreren Repositorys, glaube ich jedes Repository würde am besten durch die Aufrechterhaltung eine separate SQLAlchemy Sitzung durchgeführt werden. Allerdings habe ich in ein Problem laufen versuchen, eine Instanz eines Objekts zu bewegen, um eine Sitzung zu einer anderen Sitzung gebunden ist.

Als erstes ist die sinnvoll zu tun? Sollte jedes Repository pflegt ihre eigene UOW von einem anderen Repository trennen oder sollte es als sicher angesehen werden, um den gesamten Kontext Anteil hat die gleiche Session?

Zweitens, was ist der beste Weg, um eine Instanz von einer Session und binden sie in ein anderes zu lösen?

Drittens gibt es keine festen DDD Repository Beispiele mit SQLAlchemy im Sinne geschrieben?

War es hilfreich?

Lösung

Ich bin mit DDD Repository Muster nicht vertraut, aber unten ist ein exmaple zeigt, wie ein Objekt von einer Sitzung zur anderen bewegen:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top