67 Stimmen

SQLAlchemy DetachedInstanceError mit regulärem Attribut (keine Beziehung)

Ich habe gerade angefangen, SQLAlchemy zu verwenden und erhalte einen DetachedInstanceError und kann nirgendwo viele Informationen dazu finden. Ich verwende die Instanz außerhalb einer Sitzung, also ist es natürlich, dass SQLAlchemy nicht in der Lage ist, Beziehungen zu laden, wenn sie nicht bereits geladen sind, aber das Attribut, auf das ich zugreife, ist keine Beziehung, tatsächlich hat dieses Objekt überhaupt keine Beziehungen. Ich habe Lösungen gefunden, wie z.B. eager loading, aber das kann ich hier nicht anwenden, weil es sich nicht um eine Relation handelt. Ich habe sogar versucht, dieses Attribut vor dem Schließen der Sitzung zu "berühren", aber das verhindert die Ausnahme immer noch nicht. Was könnte die Ursache für diese Ausnahme bei einer nicht relationalen Eigenschaft sein, selbst wenn bereits einmal erfolgreich auf sie zugegriffen wurde? Für jede Hilfe bei der Fehlersuche in diesem Problem bin ich dankbar. Ich werde in der Zwischenzeit versuchen, ein reproduzierbares Standalone-Szenario zu erstellen und hier zu aktualisieren.

Aktualisierung: Dies ist die eigentliche Ausnahmemeldung mit einigen Stapeln:

  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

Das Teilmodell sieht wie folgt aus:

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)

Und das Feld client_id ist es, das diese Ausnahme bei einer Verwendung wie der folgenden verursacht:

Abfrage:

    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]

Dies ist der Grund für die Ausnahme, die später außerhalb des Sitzungsbereichs ausgelöst wird:

        msg = msg + ", client_id: %s" % job.client_id

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X