Проблема в том, что вы определили каждый из зависимых столбцов как внешние ключи отдельно, когда это не совсем то, что вы намереваетесь, вы, конечно, хотите составной внешний ключ. 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
, работает правильно.