介して挿入項目を削除するには、私は、このようなこの一つとしてエラーが出る問題抱えている:だからSQLAlchemyのStaleDataErrorは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.
を、私は何が良いアイデアを持っています問題を引き起こしていますが、私はそれを解決することができませんでした。
私はpage_id
とuser_id
に外部キーを持つpage_viewモデルを持っています。ここで
は、モデルは次のようになります。
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'
)
ここで私は、INSERT文を使用して、私のデータベースにこれに似たようないくつかの項目を追加してい関係は
orm.mapper(Page, page_table,
properties = {
'users_viewed': sa.orm.relation(
User,
secondary=page_view_table,
backref='page'),
}
)
のように見えるものです:
を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)
ログからわかるように、トランザクションはコミットされます適切に私はDBの項目を参照してください。
しかし、ORMを使用してページアイテムを削除しようとすると、StaleDataError例外が発生します。ログを見ると、ORMはdelete文を発行していますが、エラーのためにロールバックしています。
私はsession.expire_all()
と同様にsession.expunge_all()
を試してみましたが、挿入ステートメントの直後にはそれらはあまり役に立ちませんでしたが、私はまだエラーです。
これは、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
私は、二重のdelete文が容疑者だと思ったかもしれない設定に誤りORMの関係を指すが、私はそうではないと思います。
このような回答を改善するには、「列にはprimary_keyとしてマークすることができますが、データベースはそのように強制することはできませんが、」を実行してKEYではなくPRIMARY KEYであることを確認してください。これは元の質問への回答ではありませんそれを削除してください。 –