Tôi chỉ mới bắt đầu sử dụng SQLAlchemy và nhận được một DetachedInstanceError và không thể tìm thấy nhiều thông tin về điều này ở bất cứ đâu. Tôi đang sử dụng cá thể bên ngoài một phiên, vì vậy SQLAlchemy tự nhiên không thể tải bất kỳ quan hệ nào nếu chúng chưa được tải, tuy nhiên thuộc tính tôi truy cập không phải là quan hệ, trên thực tế đối tượng này không có quan hệ nào cả. Tôi tìm thấy các giải pháp như tải háo hức, nhưng tôi không thể áp dụng cho điều này bởi vì đây không phải là một mối quan hệ. Tôi thậm chí đã thử "chạm" thuộc tính này trước khi đóng phiên, nhưng nó vẫn không ngăn cản ngoại lệ. Điều gì có thể gây ra ngoại lệ này cho một thuộc tính phi quan hệ ngay cả sau khi nó đã được truy cập thành công một lần trước đó? Bất kỳ trợ giúp nào trong việc gỡ lỗi vấn đề này đều được đánh giá cao. Tôi sẽ cố gắng để có được một kịch bản độc lập có thể tái sản xuất và cập nhật tại đây.SQLAlchemy DetachedInstanceError với thuộc tính thông thường (không phải là một mối quan hệ)
Cập nhật: Đây là thông điệp ngoại lệ thực tế với một vài ngăn xếp:
File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/attributes.py", line 159, in __get__
return self.impl.get(instance_state(instance), instance_dict(instance))
File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/attributes.py", line 377, in get
value = callable_(passive=passive)
File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/state.py", line 280, in __call__
self.manager.deferred_scalar_loader(self, toload)
File "/home/hari/bin/lib/python2.6/site-packages/SQLAlchemy-0.6.1-py2.6.egg/sqlalchemy/orm/mapper.py", line 2323, in _load_scalar_attributes
(state_str(state)))
DetachedInstanceError: Instance <ReportingJob at 0xa41cd8c> is not bound to a Session; attribute refresh operation cannot proceed
Mô hình một phần trông như thế này:
metadata = MetaData()
ModelBase = declarative_base(metadata=metadata)
class ReportingJob(ModelBase):
__tablename__ = 'reporting_job'
job_id = Column(BigInteger, Sequence('job_id_sequence'), primary_key=True)
client_id = Column(BigInteger, nullable=True)
Và client_id lĩnh vực là những gì đang gây ra ngoại lệ này với một cách sử dụng như bên dưới:
Truy vấn:
jobs = session \
.query(ReportingJob) \
.filter(ReportingJob.job_id == job_id) \
.all()
if jobs:
# FIXME(Hari): Workaround for the attribute getting lazy-loaded.
jobs[0].client_id
return jobs[0]
Đây là những gì gây nên các ngoại lệ sau ra khỏi phạm vi phiên:
msg = msg + ", client_id: %s" % job.client_id
Điều này có thể trợ giúp: http://stackoverflow.com/a/25694346/134904 – kolypto