2014-11-15 64 views
8

我在從PostTag表中刪除包含PostTag列的記錄時遇到問題。這是我的關係表:如何從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() 

行從多到許多關係被刪除,但也有來自的記錄表。

我只是需要從PostTag表中刪除記錄了一些條件(Post=1例如)

我在網上搜索,但我沒有發現任何確鑿。我不需要在多對多的關係上進行級聯。

這是SQL日誌:

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不應該存在。

UPDATE /也許解決

我有種解決了這個有:

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

但是,這不只是ORM方式。同樣適用於插入。我會嘗試得到這個解決ORM的方式。如果我讓這個問題消失,我會回答問題。

回答

14

試試這個:

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

在這裏,我們正在重新定義集合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和更新它提交更改。

如果我們只有一個標籤(比如sometag),我們可以使用remove方法是這樣的:

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

你能解釋爲什麼這不起作用嗎? 'tags = post.tags tags = []' – Konrad

+0

它將它更新爲提交,但是如果你看看db上發生了什麼。這實際上是在我的情況下發送4000個刪除。雖然它可以發送一個。 – Drachenfels

1

嘗試從集合而不是刪除對象:

post[0].tags.clear() 

你也可以刪除個別項目:

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

「的帖子[0] .tags.clear()」 - 這不會爲我工作。我收到以下內容: AttributeError:'InstrumentedList'對象沒有'clear'屬性 –

+0

我在SQLAlchemy文檔中找不到任何clear()函數。你能提供一個鏈接到文檔? – ChickenFeet

+0

Python 3.3引入了一個list.clear()方法。 – nikola

相關問題