order_by example binds python sqlalchemy key composite database-relations

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''))