without script query manager example python sqlalchemy flask-sqlalchemy flask-migrate

python - script - No se pudo ensamblar ninguna columna de clave primaria para la tabla asignada



sql alchemy migrate (2)

Cuando intento crear una migración de esquema de base de datos, obtengo este error extraño. ¿Puedes ayudarme, por favor, a descubrir qué está mal?

$ python app.py db upgrade [skipped] sqlalchemy.exc.ArgumentError: Mapper Mapper|EssayStateAssociations|essay_associations could not assemble any primary key columns for mapped table ''essay_associations''

Mi modelo:

class EssayStateAssociations(db.Model): __tablename__ = ''essay_associations'' application_essay_id = db.Column( db.Integer, db.ForeignKey("application_essay.id"), primary_key=True), theme_essay_id = db.Column( db.Integer, db.ForeignKey("theme_essay.id"), primary_key=True), state = db.Column(db.String, default="pending")


No puede tener dos claves primarias en una tabla. En su lugar, debe utilizar una clave primaria compuesta. Esto se puede hacer agregando una PrimaryKeyConstraint en su modelo como se muestra a continuación (recuerde agregar una coma antes de cerrar el corchete en __table_args__ :

from db import PrimaryKeyConstraint class EssayStateAssociations(db.Model): __tablename__ = ''essay_associations'' __table_args__ = ( PrimaryKeyConstraint(''application_essay_id'', ''theme_essay_id''), ) application_essay_id = db.Column( db.Integer, db.ForeignKey("application_essay.id")) theme_essay_id = db.Column( db.Integer, db.ForeignKey("theme_essay.id")) state = db.Column(db.String, default="pending")


Obtiene este error porque tiene comas finales después de las definiciones de la Column() , lo que hace que application_essay_id y theme_essay_id como una tupla de un elemento que contiene una Column lugar de solo una Column . Esto evita que SQLAlchemy "vea" que las columnas están presentes y, en consecuencia, hace que su modelo no contenga ninguna columna de clave principal.

Si simplemente reemplaza

application_essay_id = db.Column( db.Integer, db.ForeignKey("application_essay.id"), primary_key=True), theme_essay_id = db.Column( db.Integer, db.ForeignKey("theme_essay.id"), primary_key=True),

con

application_essay_id = db.Column( db.Integer, db.ForeignKey("application_essay.id"), primary_key=True) theme_essay_id = db.Column( db.Integer, db.ForeignKey("theme_essay.id"), primary_key=True)

entonces su error será arreglado.

Aparte: dado que SQLAlchemy (y Alembic and Flask-SQLAlchemy) contienen algunas sintaxis para declarar modelos / tablas que implican pasar una secuencia de Column separadas por comas como argumentos (por ejemplo, a op.create_table() o Table() constructor) y otros eso implica declarar una clase con Column s como propiedades de clase, es muy fácil encontrar este error al cortar y pegar las declaraciones de Column desde la primera sintaxis a la segunda y olvidarse de eliminar algunas de las comas. Sospecho que este error fácil de cometer es la razón por la que esta pregunta tiene una gran cantidad de visitas, más de 16000 en el momento en que publico esta respuesta.