Question

J'ai essayé de trouver quelques exemples de la façon de mettre en œuvre le modèle du référentiel avec SQLAlchemy. Plus précisément, la mise en œuvre plus d'un dépôt.

Dans le cas de plusieurs Référentiels, je crois que chaque dépôt serait mieux mis en œuvre par le maintien d'une séance de SQLAlchemy séparée. Cependant, je suis en cours d'exécution dans un problème en essayant de déplacer une instance d'un objet lié à une session à une autre session.

D'abord, est-ce sens pour faire? Au cas où chaque dépôt maintenir son propre UOW distinct de tout autre dépôt ou doit-il être considéré comme sûr d'avoir la part entière du contexte de la même session?

Deuxièmement, quelle est la meilleure façon de détacher une instance d'une session et de se lier à un autre?

Troisièmement, y at-il des exemples de référentiel DDD solides écrites avec SQLAlchemy à l'esprit?

Était-ce utile?

La solution

Je ne suis pas familier avec DDD modèle de référentiel, mais au-dessous est un exmaple montrant comment déplacer un objet d'une session à l'autre:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top