estoy teniendo un problema donde consigo un error como este:SQLAlchemy StaleDataError en la eliminación de elementos insertados a través de ORM sqlalchemy.orm.exc.StaleDataError
"MyPyramidApplication Error"<class 'sqlalchemy.orm.exc.StaleDataError'>: DELETE statement on table 'page_view' expected to delete 6 row(s); Only 0 were matched.
lo tanto, tengo una buena idea de lo está causando el problema, pero no he podido resolverlo.
Tengo un modelo page_view, que tiene una clave externa en page_id
y user_id
.
Esto es lo que se ve el modelo como:
page_view_table = sa.Table(
'page_view',
metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('page_id', sa.Integer, sa.ForeignKey('guide.id')),
sa.Column('user_id', sa.Integer, sa.ForeignKey('user.id')),
sa.Column('last_view', sa.DateTime, nullable=False),
sa.UniqueConstraint('user_id', 'page_id'),
mysql_engine='InnoDB',
mysql_charset='utf8mb4'
)
Esto es lo que las relaciones se ven como
orm.mapper(Page, page_table,
properties = {
'users_viewed': sa.orm.relation(
User,
secondary=page_view_table,
backref='page'),
}
)
estoy añadiendo algunos artículos a mi base de datos utilizando una instrucción de inserción, algo similar a esto:
ins = model.page_view_table.insert()
sql = str(ins)
sql += ' ON DUPLICATE KEY UPDATE last_view = :last_view'
session = model.Session()
session.execute(sql, page_views)
mark_changed(session)
Por lo que puedo ver en los registros, las transacciones se comprometen correctamente y veo los artículos en la base de datos.
Sin embargo, cuando intento eliminar el elemento de la página utilizando el ORM, aparece la excepción StaleDataError. Al mirar los registros, veo que el ORM emite una instrucción de eliminación pero luego retrocede debido al error.
He intentado experimentar con session.expire_all()
así como session.expunge_all()
justo después de la instrucción de inserción, pero no fueron muy útiles y sigo teniendo el error.
Esto es lo que veo en los registros de SQLAlchemy.
2011-11-05 18:06:08,031 INFO [sqlalchemy.engine.base.Engine][worker 3] DELETE FROM page_view WHERE page_view.page_id = %s AND page_view.user_id = %s
2011-11-05 18:06:08,031 INFO [sqlalchemy.engine.base.Engine][worker 3] (13818L, 259L)
2011-11-05 18:06:08,032 INFO [sqlalchemy.engine.base.Engine][worker 3] DELETE FROM page_view WHERE page_view.page_id = %s AND page_view.user_id = %s
2011-11-05 18:06:08,033 INFO [sqlalchemy.engine.base.Engine][worker 3] (13818L, 259L)
2011-11-05 18:06:08,033 INFO [sqlalchemy.engine.base.Engine][worker 3] ROLLBACK
pensé que la declaración de eliminación doble era un sospechoso, tal vez apuntando a una relación ORM mal configurado, pero no creo que ese es el caso.
Para mejorar esta respuesta, modifique la redacción --- como "Aunque las columnas se pueden marcar como primary_key, la base de datos puede no aplicarlas como tales. Asegúrese de que sean PRIMARY KEY y no KEY haciendo" O if esta no es una respuesta a la pregunta original, por favor bórrelo. –