मैं एक मुद्दा है जहाँ मैं इसी प्रकार के एक एक त्रुटि प्राप्त हो रही है: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_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'
)
यहाँ क्या संबंध, कुछ इसी तरह यह करने के लिए
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)
जहां तक मैं लॉग से बता सकता हूं, लेनदेन प्रतिबद्ध हो जाता है ठीक है और मैं डीबी में आइटम देखता हूं।
हालांकि, जब मैं ORM का उपयोग कर पृष्ठ आइटम को हटाने का प्रयास करता हूं, तो मुझे StaleDataError अपवाद मिलता है। लॉग को देखते हुए, मैं ओआरएम को डिलीट स्टेटमेंट जारी करता हूं लेकिन फिर त्रुटि के कारण वापस रोलिंग करता हूं।
मैंने डालने के बाद session.expire_all()
के साथ-साथ session.expunge_all()
के साथ प्रयोग करने का प्रयास किया है लेकिन वे बहुत उपयोगी नहीं थे और मुझे अभी भी त्रुटि है।
मैं एसक्यूएलकेमी लॉग में जो देखता हूं वह यहां है।
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
मैंने सोचा था कि डबल हटाने बयान एक पर संदेह किया जाता है, शायद गलत कॉन्फ़िगर ORM संबंध की ओर इशारा करते, लेकिन मैं यह बात है नहीं लगता।
इस उत्तर को बेहतर बनाने के लिए कृपया पृष्ठ --- जैसे कि "हालांकि कॉलम को प्राथमिक_की के रूप में चिह्नित किया जा सकता है, डेटाबेस उन्हें इस तरह लागू नहीं कर सकता है। सुनिश्चित करें कि वे प्राथमिक कुंजी हैं और कुंजी नहीं कर रहे <<आवश्यक चरणों को सम्मिलित करें>" या यदि यह मूल प्रश्न का उत्तर नहीं है कृपया इसे हटाएं। –