2016-04-15 6 views
0

У меня проблема с SQL Алхимия, пытаясь подумать о схеме SQL. У меня возникла следующая проблема.Python SQLalchemy Несколько полей таблицы

Моя схема основана на 2 классах, рейсах и поездках.

Поездка включает в себя 2 поля: flight_to и flights_from. Любое из полей - это, в основном, список рейсов, это может быть сделано из одного рейса или много рейсов (полеты по соединению).

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 для рейсов_from в любое другое имя, кроме Trip.

Будет работать тогда.

Для примера:

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 по:

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

person = query_address.address 

Это возвращает вам person объект. Таким образом, если у вас есть несколько таких имен, это даст вам ошибку

+0

Я не думаю, что вы поняли вопрос, backref здесь даже не нужен, потому что ссылка сделана только от поездки до полета – toothpick

+0

Ну, что я пробовал чтобы объяснить, почему вы получили ошибку. Чтобы быть более явным, поскольку в ошибке упоминается, что он не может создать обратную ссылку с именем «Поездка» на рейсах из-за того, что обратная ссылка «Поездка» уже была сделана flight_to. В моем ответе вторая часть, которую я только что попробовал показать примеру. Ошибка будет идти, если вы переименуете flight_from обратную ссылку. – formatkaka

Смежные вопросы