SQLAlchemy: связь с ForeignKey, состоящая из двух столбцов - PullRequest
0 голосов
/ 08 апреля 2020

Я использую SQLAlchemy для моего Flask приложения, и я wi sh для соединения двух таблиц, где должны быть установлены отношения для двух ForeignKey, которые уникальны только вместе.

Моя первая таблица выглядит так:

class Address(db.Model):
    __tablename__ = 'Address'
    idx = db.Column(db.Integer, primary_key=True)
    a_code1 = db.Column(db.Integer)
    a_code2 = db.Column(db.Integer)
    property = db.relationship('Property', backref='Address', uselist=False, lazy='select')

И моя вторая таблица выглядит следующим образом (p_code1 + p_code2 уникальны вместе, а не отдельно)

class Property(db.Model):
    __tablename__ = 'Property'
    __table_args__ = (db.UniqueConstraint('p_code1', 'p_code2', name='property_id'), )
    idx = db.Column(db.Integer, primary_key=True)
    p_code1 = db.Column(db.Integer, db.ForeignKey('Address.a_code1'))
    p_code2 = db.Column(db.Integer, db.ForeignKey('Address.a_code2'))
    addresse = db.relationship('Address', backref='Property', foreign_keys=[p_code1, p_code2], uselist=False, lazy='select')

База данных инициализируется правильно, однако, когда я пытаюсь чтобы добавить что-то в базу данных, я получаю следующие ошибки:

sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'Address' and 'Property'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.

...

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship Address.property - there are multiple foreign key paths linking the tables.  Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.

Кто-нибудь сможет определить, что я делаю неправильно?

1 Ответ

0 голосов
/ 08 апреля 2020

Тот факт, что p_code1 и p_code2 являются уникальными вместе, не является проблемой здесь, а скорее, что у вас есть два внешних ключа в одной таблице Property, указывающей на Address, поэтому sqlalchemy не знает, как чтобы сопоставить их.

Я предполагаю, что вам нужно p_code1 = a_code1 И p_code2 = a_code2, чтобы отобразить отношения. Я бы сделал это явно, установив свойство primaryjoin:

addresse = db.relationship(
    'Address',
    primaryjoin='Property.p_code1 == Address.a_code1 and Property.p_code2 == Address.a_code2',
    backref='property',
    uselist=False,
    lazy='select'
) 

Вам не нужно определять отношение в Address, если вы используете backref.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...