2015-12-22 37 views
11

我有兩個模型在同一個模塊名爲models。他們是1-1關係,並已根據SQLAlchemy docs進行配置。SQLAlchemy模型圓形導入

Vehicle.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'))) 

如果我使用的字符串建立關係(即ForeignKey('vehicles.vehicle_id')),我得到的錯誤:

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. 

如果我使用類映射,我得到了經典的圓形導入錯誤:

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' 

,我相信我可以把文件放在同一個封裝解決這個問題,但我們更希望讓他們分開。思考?

回答

8

我發現我的問題是雙重的:

  1. 我是在不當引用Vehicles我關係。它應該是relationship('Vehicle'relationship('vehicles'
  2. 顯然是不合適的聲明FK的關係裏面,我AssetSettings.py(foreign_keys=Column(ForeignKey('vehicles.vehicle_id')))的確在。我不得不申報FK,然後將其交給關係。

我的配置看現在這個樣子:

Vehicle.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) 
2

__tablename__被引用vehicles但你的外鍵引用vehicle.vehicle_id

+0

對不起上,這是一個複製/粘貼錯誤我寫這個問題的一部分。 – mam8cc

8

爲了避免循環導入錯誤,你應該使用串關係,構建,但兩者的車型都使用相同的Base - 中同樣的declarative_base實例。實例化您的Base一次,並在初始化VehicleAssetSetting時使用它。

或者,你可以明確地映射表名和類來幫助映射涉及您的車型:

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