2016-04-15 7 views
0

Ich habe ein Problem mit SQL-Alchemie, beim Versuch, über ein SQL-Schema zu denken, stieß ich auf das folgende Problem.Python SQLalchemy Mehrere Felder einer Tabelle

Mein Schema basiert auf 2 Klassen, Flug und Trip.

Eine Reise beinhaltet 2 Felder: flights_to und flights_from. Jedes der Felder ist im Grunde eine Liste von Flügen, es könnte aus einem Flug oder vielen Flügen (Connection Flights) gemacht werden.

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

Das Problem tritt auf, wenn ich zwei Felder in der gleichen Art zu erstellen:

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

ich über die Verwendung von 2 Vererbungsklassen Typen FlightTo und FlightFrom und sie an zwei verschiedenen Tischen gedacht haben, zu speichern, aber was wenn ich ein FlightFrom als FlightTo verwenden möchte? Wird der Flug in 2 Tabellen dupliziert?

Ich würde Ihre Hilfe zu schätzen wissen.

Antwort

0

backref wird verwendet, um eine neue Eigenschaft in der anderen Klasse zu definieren, mit der Sie die Beziehung verwenden. So können Sie nicht zwei Eigenschaften haben, die den gleichen Namen haben

Sie sollten Ihre backref für die flights_from zu einem anderen Namen als Trip umbenennen.

Es wird dann funktionieren.

Beispiel:

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

So können Sie die Personennamen mit house_no Zugang 100 von:

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

person = query_address.address 

Das gibt Ihnen das person Objekt. Also, wenn Sie mehrere solche Namen haben, wird es Ihnen einen Fehler geben

+0

Ich glaube nicht, dass Sie die Frage verstanden, Backref ist nicht einmal notwendig hier, weil Referenzierung von Trip zum Flug nur gemacht wird – toothpick

+0

Gut, was ich versucht habe zu erklären ist, warum Sie den Fehler haben. Um genauer zu sein, da der Fehler erwähnt, dass es keine Rückreferenz mit dem Namen "Trip" auf Flügen erstellen kann, da die Rückreferenz "Trip" bereits von flights_to genommen wurde. In meiner Antwort, der zweite Teil habe ich gerade versucht, ein Beispiel zu zeigen. Der Fehler soll gehen, wenn Sie flights_from Rückverweis umbenennen. – formatkaka

Verwandte Themen