Ist es möglich, einen SQLalchemy-Fremdschlüssel in einem Modell zu füllen und es das zugehörige Objekt zu laden

In SQLAlchemy habe ich ein Transactionlog- Modell, das ein verwandtes Mitglied hat . Diese Relation wird durch eine Spalte tlog_ppl_id in der Transactionlog-Tabelle definiert, die auf eine ppl_id- Spalte in einer Personen- Tabelle verweist (die Personentabelle enthält Mitglieder ).

Angenommen, ich habe ein neues Transactionlog-Objekt T. Wenn ich ein Member-Objekt lasse (lass es M aufrufen) und T.member = M einstellen, kann ich auf T.member zugreifen und es wird mein verknüpftes Mitglied zurückgegeben.

Was ich gerne machen möchte, ist mein neues transactionlog SQLAlchemy Objekt T und fülle die Eigenschaft tlog_ppl_id mit einem gültigen ppl_id. Nachdem ich das getan habe, würde ich gerne auf T.member zugreifen und habe SQLAlchemy laden die verwandten Personen Datensatz aus der Datenbank. Das tut es aber nicht, es gibt keine .

Also frage ich mich, ob es möglich ist, SQLAlchemy die verwandten Objekte mit einer bestimmten Anweisung zu laden, wenn ich nur die Objekte Fremdschlüsselspalten fülle?

Code zum Testen:

def test(): from app.models.data import Transactionlog T = Transactionlog() T.tlog_ppl_id = '2433A992-B8C7-4780-91DE-67D12C517C55' print(T.member) return "" 

Code im Modell:

 class Transactionlog(transactionlog): """ Transactionlog model class. """ member = relationship("People", backref=backref('transactions')) 

Ich verwende SQLalchemy 1.0.14 auf Python 3.5.1 unter Flasche (nicht mit Flasche-sqlalchemy)

  • SQLAlchemy, bekommen Objekt nicht an eine Session gebunden
  • Alembic "Fehler beim Erstellen von Prozess" in Windows7
  • Sqlalchemy generischen Fremdschlüssel (wie in django ORM)
  • SQLAlchemy zur Verwendung von PostgreSQL SERIAL zur Identitätserzeugung setzen
  • Sortieren nach einer Spalte in einer Gewerkschaftsabfrage in SqlAlchemy SQLite
  • SQLAlchemy Beziehungsfehler: Objekt hat kein Attribut 'c'
  • SQLAlchemy richtige Session Handling in Multi-Thread-Anwendungen
  • Konvertieren sqlalchemy Zeilenobjekt zu python dict
  • One Solution collect form web for “Ist es möglich, einen SQLalchemy-Fremdschlüssel in einem Modell zu füllen und es das zugehörige Objekt zu laden”

    Wenn ich dich richtig verstanden habe, dann kannst du nach load_on_pending suchen, obwohl sein Gebrauch entmutigt ist:

    Das load_on_pending Flag verbessert das Verhalten nicht, wenn das ORM normal verwendet wird – Objektreferenzen sollten auf Objektebene, nicht auf der Fremdschlüsselebene aufgebaut werden, so dass sie in einer gewöhnlichen Weise vorhanden sind, bevor ein Flush fortschreitet. Diese Flagge ist nicht für den allgemeinen Gebrauch bestimmt.

    Beachten Sie, dass alles in Ihrer test Funktion die neu erstellte T Instanz nicht zu einer Sitzung hinzugefügt wird, bevor versucht wird, die verwandte People Instanz zu drucken, so dass es einfach keine Beladung machen kann (es sei denn, einige Magie ist im Spiel und alle neuen Modellinstanzen werden hinzugefügt Zu einer Standard-Session).

    Hier ist eine kleine Demo, wie Sie vielleicht die load_on_pending Option nutzen load_on_pending , obwohl ich denke, Sie sollten wirklich nur die load_on_pending anstelle der Fremdschlüssel verwenden:

     In [8]: class A(Base): ...: __tablename__ = 'a' ...: a_id = Column(Integer, primary_key=True) In [9]: class B(Base): ...: __tablename__ = 'b' ...: b_id = Column(Integer, primary_key=True, autoincrement=True) ...: a_id = Column(Integer, ForeignKey('a.a_id')) ...: a = relationship('A', load_on_pending=True) In [10]: class C(Base): ...: __tablename__ = 'c' ...: C_id = Column(Integer, primary_key=True, autoincrement=True) ...: a_id = Column(Integer, ForeignKey('a.a_id')) ...: a = relationship('A') In [16]: session.add(A(a_id=1)) In [17]: session.commit() In [18]: b = B() In [19]: session.add(b) In [20]: b.a_id = 1 In [21]: ba Out[21]: <__main__.A at 0x7ff32388ab70> In [22]: session.rollback() In [23]: c = C() In [25]: session.add(c) In [26]: c.a_id = 1 In [27]: ca In [28]: session.commit() In [29]: ca Out[29]: <__main__.A at 0x7ff32388ab70> 

    Aber, wie bereits erwähnt, wäre der empfohlene Ansatz, die Instanzen zu verwenden, nicht die Fremdschlüssel:

     # Will look the instance up in the session's identity map, if present T.member = session.query(People).get('2433...') 

    Ich denke, dass der Zen von Python in diesem Fall gilt:

    Explizit ist besser als implizit.

    IE explizit Abfrage für das to-be-bezogene Objekt anstatt sich auf implizite Lookup nach der Einstellung der Fremdschlüssel.

    Python ist die beste Programmiersprache der Welt.