这是另一种选择,但我不确定它是否适用于您的问题:
-
从数据库中检索对象以及所有需要的关系。你也可以通过
lazy='joined'
或
lazy='subquery'
关系或电话
options(eagerload(relation_property)
查询方法,或者只访问触发其加载所需的属性。
-
从会话中删除对象。此时将不支持延迟加载对象属性。
-
现在您可以安全地修改对象了。
-
当需要更新数据库中的对象时,必须将其合并回会话并提交。
更新
:这里是概念代码示例的证明:
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relation, eagerload
metadata = MetaData()
Base = declarative_base(metadata=metadata, name='Base')
class Project(Base):
__tablename__ = 'projects'
id = Column(Integer, primary_key=True)
name = Column(String)
class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
project_id = Column(ForeignKey(Project.id))
project = relation(Project,
cascade='save-update, expunge, merge',
lazy='joined')
engine = create_engine('sqlite://', echo=True)
metadata.create_all(engine)
session = sessionmaker(bind=engine)()
proj = Project(name='a')
stud = Student(project=proj)
session.add(stud)
session.commit()
session.expunge_all()
assert session.query(Project.name).all()==[('a',)]
stud = session.query(Student).first()
# Use options() method if you didn't specify lazy for relations:
#stud = session.query(Student).options(eagerload(Student.project)).first()
session.expunge(stud)
assert stud not in session
assert stud.project not in session
stud.project.name = 'b'
session.commit() # Stores nothing
assert session.query(Project.name).all()==[('a',)]
stud = session.merge(stud)
session.commit()
assert session.query(Project.name).all()==[('b',)]