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.