python - example - Relaciones en claves compuestas usando sqlalchemy
sqlalchemy relationship example (1)
El problema es que ha definido cada una de las columnas dependientes como claves externas por separado, cuando eso no es realmente lo que pretende, por supuesto, quiere una clave externa compuesta. Sqlalchemy está respondiendo a esto diciendo (de una manera no muy clara), que no puede adivinar qué clave externa usar ( firstName
o lastName
).
La solución, que declara una clave foránea compuesta, es un poco torpe en forma declarativa, pero aún bastante obvia:
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]),
{})
Lo importante aquí es que las definiciones ForeignKey
se han ido de las columnas individuales, y ForeignKeyConstraint
se agrega a una variable de clase __table_args__
. Con esto, la relationship
definida en Author.books
funciona a la Author.books
.
Tengo este modelo simple de Autor - Libros y no puedo encontrar la manera de hacer de FirstName y LastName una clave compuesta y usarla en relación. ¿Algunas ideas?
from sqlalchemy import create_engine, ForeignKey, Column, String, Integer
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine(''mssql://user:pass@library'')
engine.echo = True
session = sessionmaker(engine)()
class Author(Base):
__tablename__ = ''authors''
firstName = Column(String(20), primary_key=True)
lastName = Column(String(20), primary_key=True)
books = relationship(''Book'', backref=''author'')
class Book(Base):
__tablename__ = ''books''
title = Column(String(20), primary_key=True)
author_firstName = Column(String(20), ForeignKey(''authors.firstName''))
author_lastName = Column(String(20), ForeignKey(''authors.lastName''))