Acho que posso dar uma dica sobre este problema. A versão curta é:"Você provavelmente terá que modificar os dados no banco de dados manualmente para resolver o problema".
A versão mais longa:eu tive um problema semelhante com o SQLite. Eu tinha a seguinte tabela mapeada:
ingredients = Table('ingredients', metadata,
Column('recipe_title', Unicode, ForeignKey('recipes.title'), primary_key=True),
Column('product_title', Unicode, ForeignKey('products.title'), primary_key=True),
Column('amount', Integer, nullable=False),
Column('unit_title', Unicode, ForeignKey('units.title')))
ver essa chave primária composta? De alguma forma, consegui inserir duas linhas com o mesmo par recipe_title/product_title. Fiquei surpreso ao descobrir que não havia uma única restrição no lado do SQLite para esta tabela (sem chave primária, sem chave fereign - era apenas uma tabela de baunilha simples), mas bem - é assim que o sqlalchemy funciona, não meu o negócio.
Então, quando tentei excluir um objeto persistente envolvendo essas duas linhas, o sqlalchemy viu que suas restrições foram violadas e lançou o 'StaleDataError'. Finalmente, tive que remover manualmente uma linha duplicada da tabela SQLite.