SQLAlchemy Modell Rundschreiben Import

Ich habe zwei Modelle im selben Modul namens models . Sie sind eine 1-1 Beziehung und wurden pro SQLAlchemy docs konfiguriert.

Fahrzeug.py

 from models.AssetSetting import AssetSetting class Vehicle(Base): __tablename__ = 'vehicles' vehicle_id = Column(Integer, primary_key=True) ... settings = relationship('AssetSetting', backref=backref('asset_settings')) 

AssetSetting.py

 from models.Vehicle import Vehicle class AssetSetting(Base): __tablename__ = 'asset_settings' asset_alert_setting_id = Column(Integer, primary_key=True, autoincrement=True) ... vehicle = relationship('vehicles', foreign_keys=Column(ForeignKey('vehicles.vehicle_id'))) 

Wenn ich das String-Relationship-Gebäude verwende (dh ForeignKey('vehicles.vehicle_id') ) bekomme ich den Fehler:

 sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper|AssetSetting|asset_settings, expression 'vehicles' failed to locate a name ("name 'vehicles' is not defined"). If this is a class name, consider adding this relationship() to the <class 'models.AssetSetting.AssetSetting'> class after both dependent classes have been defined. 

Wenn ich das Klassenmapping verwende, bekomme ich den klassischen kreisförmigen Importfehler:

 Traceback (most recent call last): File "tracking_data_runner.py", line 7, in <module> from models.Tracker import Tracker File "/.../models/Tracker.py", line 5, in <module> from models.Vehicle import Vehicle File "/.../models/Vehicle.py", line 13, in <module> from models.Tracker import Tracker ImportError: cannot import name 'Tracker' 

Ich glaube, ich könnte dieses Problem beheben, indem ich die Dateien in das gleiche Paket, aber würde es vorziehen, sie getrennt zu halten. Gedanken?

3 Solutions collect form web for “SQLAlchemy Modell Rundschreiben Import”

Ich entdeckte mein Problem war zweifach:

  1. Ich referenziere Vehicles in meiner Beziehung. Es sollte relationship('Vehicle' nicht relationship('vehicles'
  2. Anscheinend ist es unangebracht, die FK innerhalb der Beziehung zu erklären, wie ich es in AssetSettings.py ( foreign_keys=Column(ForeignKey('vehicles.vehicle_id')) ). Ich musste die FK deklarieren und dann an die Beziehung weitergeben.

Meine Konfigurationen sehen jetzt so aus:

Fahrzeug.py

 class Vehicle(Base, IDiagnostable, IUsage, ITrackable): __tablename__ = 'vehicles' vehicle_id = Column(Integer, primary_key=True)_id = Column(Integer) settings = relationship('AssetSetting', backref=backref('asset_settings')) 

AssetSetting.py

 class AssetSetting(Base): __tablename__ = 'asset_settings' asset_alert_setting_id = Column(Integer, primary_key=True, autoincrement=True) vehicle_id = Column(ForeignKey('vehicles.vehicle_id')) vehicle = relationship('Vehicle', foreign_keys=vehicle_id) 

Um kreisförmige Importfehler zu vermeiden, sollten Sie das String-Relationship-Building verwenden , aber beide Modelle müssen dieselbe Base – die gleiche declarative_base Instanz. Instanzieren Sie Ihre Base einmal und verwenden Sie sie bei der Initialisierung von Vehicle und AssetSetting .

Oder Sie können die Tabellennamen und Klassen explizit zuordnen, um dem Mapper zu helfen, Ihre Modelle zu verknüpfen:

 Base = declarative_base(class_registry={"vehicles": Vehicle, "asset_settings": AssetSetting}) 

Ihr __tablename__ referenziert vehicles aber Ihr vehicle.vehicle_id referenziert vehicle.vehicle_id

  • SQLAlchemy + SQL Injection
  • Mit Liste auf postgresql JSON Typ mit sqlalchemy
  • Nicht funktionierendes Beispiel mit "passiv-deletes" -Richtlinie in sqlalchemy doc
  • SQLAlchemy: update from_select
  • Verwenden Sie nur den Standardspaltenwert, wenn ein anderes Feld einen bestimmten Wert hat
  • SQLAlchemy: Erstellen Sie eine absichtlich leere Abfrage?
  • Transaktionen und sqlalchemy
  • PyCharm SQLAlchemie autocomplete
  • Pandas schreiben Dataframe zu anderen postgresql Schema
  • Zuordnung db varchar zu Domänenobjekt bool
  • Konservieren Sie die Tastenbezeichnung beim Erstellen eines joinedload sql_query in SQLAlchemy
  • Python ist die beste Programmiersprache der Welt.