मेरे पास Test
मॉडल/टेबल और TestAuditLog
मॉडल/टेबल है, जो एसक्यूएलकेमी और एसक्यूएल सर्वर 2008 का उपयोग कर रहा है। दोनों के बीच संबंध Test.id == TestAuditLog.entityId
है, जिसमें एक परीक्षण के साथ कई लेखापरीक्षा होती है लॉग। TestAuditLog
Test
तालिका में पंक्तियों में परिवर्तनों का इतिहास रखने का इरादा है। मैं ट्रैक करना चाहता हूं कि Test
हटा दिया गया है, लेकिन मुझे इसके साथ परेशानी हो रही है। SQL सर्वर प्रबंधन स्टूडियो में, मैंने FK_TEST_AUDIT_LOG_TEST
रिश्ते की "Enforce Foreign Key Constraint" संपत्ति को "नहीं" पर सेट किया है, यह सोचकर कि TestAuditLog
पंक्ति entityId
के साथ मौजूद होने की अनुमति देगी जो अब Test.id
से कनेक्ट नहीं है क्योंकि Test
हटा दी गयी है। हालांकि, जब मैं SQLAlchemy के साथ एक TestAuditLog
बनाने का प्रयास करें और फिर Test
हटाने के लिए, मैं एक त्रुटि मिलती है:SQLAlchemy - रिश्ते पर विदेशी कुंजी बाधा को लागू न करें
(IntegrityError) ('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column 'AL_TEST_ID', table 'TEST_AUDIT_LOG'; column does not allow nulls. UPDATE fails. (515) (SQLExecDirectW); [01000] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (3621)") u'UPDATE [TEST_AUDIT_LOG] SET [AL_TEST_ID]=? WHERE [TEST_AUDIT_LOG].[AL_ID] = ?' (None, 8)
मैं, Test
और TestAuditLog
के बीच विदेशी कुंजी संबंधों की वजह से लगता है के बाद मैं Test
पंक्ति को हटा, SQLAlchemy NULL
entityId
रखने के लिए उस परीक्षण के ऑडिट लॉग को अपडेट करने का प्रयास कर रहा है। मैं यह नहीं करना चाहता हूं; मैं चाहता हूं कि स्क्लेक्लेमी अकेले ऑडिट लॉग छोड़ दें। ऑडिट लॉग मौजूद होने की अनुमति देने के लिए मैं स्क्लाक्लेमी को कैसे बता सकता हूं जिसका entityId
किसी भी Test.id
से कनेक्ट नहीं है?
मैं सिर्फ अपनी टेबल से ForeignKey
को दूर करने की कोशिश की, लेकिन मैं अभी भी myTest.audits
कहना और एक परीक्षण के ऑडिट लॉग के सभी प्राप्त करने में सक्षम होना चाहते हैं, और SQLAlchemy Test
और TestAuditLog
में शामिल होने के लिए कैसे नहीं जानते हुए भी बारे में शिकायत की। जब मैंने relationship
पर primaryjoin
निर्दिष्ट किया, तो यह कॉलम के साथ ForeignKey
या ForeignKeyConstraint
नहीं होने के बारे में चिंतित था।
class TestAuditLog(Base, Common):
__tablename__ = u'TEST_AUDIT_LOG'
entityId = Column(u'AL_TEST_ID', INTEGER(), ForeignKey(u'TEST.TS_TEST_ID'),
nullable=False)
...
class Test(Base, Common):
__tablename__ = u'TEST'
id = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False)
audits = relationship(TestAuditLog, backref="test")
...
और यहाँ इसकी ऑडिट लॉग रखते हुए मैं कैसे एक परीक्षण नष्ट करने के लिए कोशिश कर रहा हूँ है, उनके entityId
बरकरार:
test = Session.query(Test).first()
Session.begin()
try:
Session.add(TestAuditLog(entityId=test.id))
Session.flush()
Session.delete(test)
Session.commit()
except:
Session.rollback()
raise
'रिश्तेदार' पर 'passive_deletes = 'all'' ने किया था!इस तरह मैं रिश्तों को रखने में सक्षम था और स्क्लेक्लेमी वापस नहीं गया और 'test' हटाने पर' entityId' को मिटा देने का प्रयास करें। धन्यवाद! –
बस संदर्भ के लिए - इसे रिश्ते के मूल पक्ष पर 'lazy =" गतिशील "भी सेट करना होगा, इसलिए जब आपको इसकी आवश्यकता न हो तो sqlalchemy सभी बच्चों को नहीं लाएगा (यानी जब मूल तालिका में केवल अप्रासंगिक फ़ील्ड अपडेट हो)। – Greg0ry
@ ग्रेग 0: नहीं, आपको इसकी आवश्यकता नहीं है। जैसा कि [लोडर रणनीतियों का उपयोग करना: आलसी लोडिंग, उत्सुक लोडिंग] (http://docs.sqlalchemy.org/en/rel_1_0/orm/loading_relationships.html#using-loader-strategies-lazy-loading-eager-loading) में प्रलेखित के रूप में: * डिफ़ॉल्ट रूप से, सभी अंतर-वस्तु संबंध आलसी लोडिंग हैं ... *। इसलिए जब तक आप अन्यथा नहीं करते हैं, तब तक माता-पिता को तब तक बच्चों को लोड नहीं करना चाहिए जब तक कि आप उन्हें एक्सेस न करें। – van