2017-04-27 65 views
0

說我有很多一對多的關係,建議在http://flask-sqlalchemy.pocoo.org/2.1/models/瓶SQLAlchemy的 - 插入多到許多隻與實體的ID

page = Page.query.filter_by(id=value).one() 

tags = db.Table('tags', 
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')), 
    db.Column('page_id', db.Integer, db.ForeignKey('page.id')) 
) 

class Page(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    tags = db.relationship('Tag', secondary=tags, 
    backref=db.backref('pages', lazy='dynamic')) 

class Tag(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 

我有一個頁面完全確定

我也有列表的標籤ids。當前工作的代碼是:

for id in tag_ids: 
    tag = Tag.query.filter_by(id=id).one() #wanna avoid this 
    page.tags.append(tag) 

對於更復雜的表格,這可能是低效的,因爲它將使不必要的查詢來識別標籤的實體,只是爲了滿足SQLAlchemy的架構。所以:我如何才能通過提供頁面ID和標籤ID插入標籤表?

我嘗試過,沒有成功,這樣的:

tags.insert().values(tag_id=value1, page_id=value2) 
db.session.commit() 

回答

2
page_id = Page.query.get(value).id 

for tag_id in tag_ids: 
    db.session.connection().execute(tags.insert.values(tag_id=tag_id, page_id=page_id)) 
+0

這將是db.session.connection()而不是db.session.connection。此外,此解決方案僅適用於頁面實體已存在於數據庫中的情況。我找不到在單個事務中創建頁面及其標籤的方法。 – LRMAAX

+0

謝謝你的正確。標籤是一個關聯表。其中的字段都是外鍵。 – stamaimer