Проблема в том, что вы определили каждый из зависимых столбцов как внешние ключи отдельно, когда это не совсем то, что вы намерены, вам, конечно, нужен составной внешний ключ. Sqlalchemy отвечает на это, говоря (не очень ясно), что он не может угадать, какой внешний ключ использовать (firstName
или lastName
).
Решение, объявляющее составной внешний ключ, немного неуклюже в декларативном, но все еще довольно очевидном:
class Book(Base):
__tablename__ = 'books'
title = Column(String(20), primary_key=True)
author_firstName = Column(String(20))
author_lastName = Column(String(20))
__table_args__ = (ForeignKeyConstraint([author_firstName, author_lastName],
[Author.firstName, Author.lastName]),
{})
Здесь важно то, что определения ForeignKey
взяты из отдельных столбцов, а ForeignKeyConstraint
добавлено к переменной класса __table_args__
. При этом relationship
, определенный в Author.books
, работает как раз.