0

Давайте предположим, что следующие две таблицы MySQL:Как создать несколько отношений для нескольких внешних ключей, указывающих на одну и ту же таблицу?

-- ----------------------------------------------------- 
-- Table `mydb`.`Person` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`Person` (
    `id` INT NOT NULL , 
    `first_name` VARCHAR(45) NOT NULL , 
    `last_name` VARCHAR(45) NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `mydb`.`Parents` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`Parents` (
    `person_id` INT NOT NULL , 
    `mother` INT NOT NULL , 
    `father` INT NOT NULL , 
    PRIMARY KEY (`person_id`) , 
    INDEX `mother_idx` (`mother` ASC) , 
    INDEX `father_fk_idx` (`father` ASC) , 
    CONSTRAINT `person_fk` 
    FOREIGN KEY (`person_id`) 
    REFERENCES `mydb`.`Person` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `mother_fk` 
    FOREIGN KEY (`mother`) 
    REFERENCES `mydb`.`Person` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `father_fk` 
    FOREIGN KEY (`father`) 
    REFERENCES `mydb`.`Person` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

Есть 3 один-к-многим между двумя таблицами.

Классы модели, которые будут использоваться SQLAlchemy, может быть что-то подобное:

class Person(Base) 
    id = Column(Integer, primary_key=True) 
    first_name = Column(String) 
    last_name = Column(String) 

class Parents(Base) 
    person_id = Column(Integer, ForeignKey('person.id'), primary_key=True) 
    mother_id = Column(Integer, ForeignKey('person.id')) 
    father_id = Column(Integer, ForeignKey('person.id')) 

И вот три backref отношения, которые будут добавлены к Parents таблице:

person = relationship(Person, backref=backref('parents', uselist=True)) 
mother = relationship(Person, backref=backref('mothers', uselist=True)) 
father = relationship(Person, backref=backref('fathers', uselist=True)) 

К сожалению, эти отношения недействительны; нет ошибок при создании таблиц, но следующие появляется при попытке вставить:

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship ... 

Будучи очень новым для SQLAlchemy, у меня возникают проблемы с этой ситуацией. Пожалуйста посоветуй.

[Edit 1]

Небольшие исправления в коде.

ответ

0

Я нашел решение here. Ключ должен использовать аргумент foreign_keys.

Таким образом, отношения могут быть что-то похожее на:

person = relationship(Person, backref=backref('parents', uselist=True), foreign_keys=person_id) 
mother = relationship(Person, backref=backref('mothers', uselist=True), foreign_keys=mother_id) 
father = relationship(Person, backref=backref('fathers', uselist=True), foreign_keys=father_id) 

(Я добавил это как ответ, потому что это решение проблемы, и это работает, я не знаю, если это. right способ делать что-то в SQLAlchemy, поэтому я с нетерпением жду любых других ответов/альтернатив.)

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