2014-11-15 5 views
8

मुझे तालिका से रिकॉर्ड हटाने में समस्याएं आ रही हैं जिनमें Post और Tag कॉलम शामिल है। यह मेरा संबंध तालिका है:SQLAlchemy में कई से कई (माध्यमिक) तालिका से रिकॉर्ड कैसे हटाएं?

tags = db.Table('PostTag', 
    db.Column('Tag', db.Integer, db.ForeignKey('Tag.Id')), 
    db.Column('Post', db.Integer, db.ForeignKey('Post.Id')) 
) 

और

tags = db.relationship(Tag, secondary=tags, backref=db.backref('Post', lazy='dynamic')) 

जब मैं ऐसा करते हैं:

from models.Post import Post 

posts = Post.query.join(Post.tags).filter(Post.Id == id).all() 
if(posts): 
    return posts 
return False 

और फिर

for posttag in post[0].tags: 
    db.session.delete(posttag) 
    db.session.flush() 

पंक्तियाँ से कई-से-अनेक संबंध हटा दिए गए हैं लेकिनसे भी रिकॉर्ड हैंटेबल।

मैं सिर्फ मैं इंटरनेट खोज की, लेकिन मैं कुछ भी निर्णायक नहीं मिला कुछ हालत (उदाहरण के लिए Post=1)

के लिए PostTag मेज से रिकॉर्ड नष्ट करने के लिए की जरूरत है। मुझे कई से अधिक रिश्ते पर कैस्केड की जरूरत नहीं है।

297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 3 
297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 18 
297 Query DELETE FROM `Tag` WHERE `Tag`.`Id` = 14 

अंतिम पंक्ति 297 Query DELETE FROM टैग WHERE टैग . ईद = 14 वहां नहीं होना चाहिए:

यह एसक्यूएल लॉग है।

अद्यतन/शायद समाधान

मैं एक तरह से साथ इस हल:

sql = 'DELETE FROM PostTag WHERE Post=%s' 
db.engine.execute(sql, post,()) 

लेकिन वह सिर्फ ORM तरीका नहीं है। डालने के लिए ही चला जाता है। मैं इस हल किए गए ओआरएम तरीके को पाने का प्रयास करूंगा। अगर मैं इस समस्या को दूर करता हूं तो मैं जवाब पोस्ट करूंगा।

उत्तर

14

इस प्रयास करें post.tags खाली सरणी में और परिवर्तन करने के लिए। यह समझाने के लिए मैं SQLAlchemy docs पर गौर करेंगे:

Collections in SQLAlchemy are transparently instrumented. Instrumentation means that normal operations on the collection are tracked and result in changes being written to the database at flush time.

तो SQLAlchemy परिवर्तन हम संग्रह post.tags और अद्यतन उस पर प्रतिबद्ध करने के लिए बनाने के का ट्रैक रखता है। यह मेरे लिए काम नहीं करता है - ") पोस्ट [0] .tags.clear ("

post = db.session.query(Post).get(1) 
post.tags.remove(sometag) 
db.session.commit() 
+0

क्या आप समझा सकते हैं कि यह क्यों काम नहीं करता है? 'टैग = पोस्ट.tags टैग = []' – Konrad

+0

यह इसे प्रतिबद्धता में अपडेट करता है, लेकिन यदि आप डीबी पर क्या होता है तो देखें। यह वास्तव में मेरे मामले में 4000 हटाने में भेज रहा है। हालांकि यह एक भेज सकता है। – Drachenfels

1

कोशिश के बजाय संग्रह से वस्तुओं को हटाने के लिए:

post[0].tags.clear() 

तुम भी व्यक्तिगत आइटम निकाल सकता है:

post = db.session.query(Post).get(1) 
post.tags = [] 
db.session.commit() 

यहाँ हम संग्रह को पुनर्परिभाषित कर रहे हैं:

post[0].tags.remove(posttag) 
+1

:

अगर हम केवल एक टैग था (जैसे कि sometag) हम remove विधि इस तरह इस्तेमाल कर सकते हैं।मुझे निम्न मिलता है: विशेषताएँ त्रुटि: 'इंस्ट्रूमेंटलिस्ट' ऑब्जेक्ट में कोई विशेषता नहीं है 'स्पष्ट' –

+0

मुझे SQLAlchemy दस्तावेज़ में कोई स्पष्ट() फ़ंक्शन नहीं मिल रहा है। क्या आप दस्तावेज़ों के लिए एक लिंक प्रदान कर सकते हैं? – ChickenFeet

+0

पायथन 3.3 ने एक सूची प्रस्तुत की। सरल() विधि। – nikola

संबंधित मुद्दे