2016-04-15 23 views
0

我在嘗試思考SQL架構時遇到以下問題,但SQL SQL Alchemy出現問題。Python SQLalchemy表中的多個字段

我的模式基於2個班,Flight和Trip。

旅程包含2個字段:flights_to和flights_from。 任何字段基本上是一個航班列表,它可以由一個航班或多個航班(Connection航班)組成。

class Trip(Base): 
    __tablename__ = "Trip" 
    __table_args__ = {'sqlite_autoincrement': True} 
    id = Column(Integer, primary_key = True) 
    flights_to = relationship("Flight", backref="Trip") 
    flights_from = relationship("Flight", backref="Trip") 

class Flight(Base): 
    __tablename__ = "Flight" 
    __table_args__ = {'sqlite_autoincrement': True} 
    id = Column(Integer, primary_key = True) 
    arrival_airport = Column(String(20)) 
    departure_airport = Column(String(20)) 
    flight_number = Column(Integer) 
    trip_id = Column(Integer, ForeignKey('Trip.id')) 

當我創建在同類型的2場的問題發生:

sqlalchemy.exc.ArgumentError: Error creating backref 'Trip' on relationship 'Trip.flights_from': property of that name exists on mapper 'Mapper|Flight|Flight'

我曾經想過用2繼承類型FlightTo和FlightFrom類和在兩個不同的表保存它們,但什麼如果我想使用FlightFrom作爲FlightTo?這個航班是否會在2張表格中複製?

我將不勝感激您的幫助。

回答

0

backref用於定義您正在使用關係的另一個類的新屬性。因此,您不能擁有兩個同名的財產

您應該將您的backref重命名爲flights_from至Trip之外的任何其他名稱。

它會工作。

例如:

query_address = Address.query.filter_by(house_no=100).first() 

person = query_address.address 

這將返回你person對象:

class Person(Model): 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    address = relationship("Address",backref="address") 

class Address(Model): 
    id = Column(Integer, primary_key=True) 
    house_no = Column(Integer) 
    person_id = Column(Integer, ForeignKey('person.id')) 

所以,你可以通過house_no 100訪問的人的名字。 因此,如果你有多個這樣的名字,它會給你一個錯誤

+0

我不認爲你理解這個問題,backref甚至沒有必要在這裏,因爲引用是從Trip到僅飛行 – toothpick

+0

那麼我試過了解釋是爲什麼你有錯誤。更明確地說,由於錯誤提到它不能在航班上創建名稱爲「Trip」的反向參考,因爲反向參考''Trip'已被flight_to採用。在我的回答中,我剛剛試圖展示一個示例的第二部分。如果您重命名flights_from反向引用,則錯誤將消失。 – formatkaka