2017-06-08 24 views
1

的名單我已經設置了,看起來大致是這樣的一個SQLAlchemy的數據庫:SQLAlchemy的查詢中使用的元素

class ChangelogEntry(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    apps = db.relationship('App', secondary=app_changelogEntry) 
    appGroups = db.relationship('AppGroup', secondary=appGroup_changelogEntry) 

class App(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(32), unique=True, index=True) 
    appGroups = db.relationship('AppGroup', secondary=app_appGroup) 

class AppGroup(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(32), unique=True, index=True) 
    apps = db.relationship('App', secondary=app_appGroup) 

UPDATE:

app_changelogEntry = db.Table('App_ChangelogEntry', 
    db.Column('app_id', db.Integer, db.ForeignKey('app.id')), 
    db.Column('changelog_id', db.Integer, db.ForeignKey('changelog_entry.id')) 
) 

appGroup_changelogEntry = db.Table('AppGroup_ChangelogEntry', 
    db.Column('appGroup_id', db.Integer, db.ForeignKey('app_group.id')), 
    db.Column('changelogEntry_id', db.Integer, db.ForeignKey('changelog_entry.id')) 
) 

app_appGroup = db.Table('App_AppGroup', 
    db.Column('app_id', db.Integer, db.ForeignKey('app.id')), 
    db.Column('appGroup_id', db.Integer, db.ForeignKey('app_group.id')) 
) 

應用程序可以是幾個AppGroups並且用戶可以創建的一部分更改日誌條目並可以選擇此ChangelogEntry所屬的App/Apps和/或AppGroups。

它看起來像這樣:

enter image description here

好吧。我只想讓所有屬於例如App3(App3是AppGroups Group1和Group2的一部分),在這種情況下是Group1和Group2。

我希望你能幫助我!

+1

請包括關聯表以及。 –

+0

我是否正確理解你的意圖:你希望查詢與給定應用程序/應用程序有直接關係的更改日誌條目,以及與包含給定應用程序/應用程序的組有關係的更改日誌條目? –

+0

我現在包含關聯表。我希望現在更容易理解。但你是對的,那就是我想要的。 –

回答

2

工會可能很適合手頭的任務:通過組和直接應用程序關係找到更改日誌條目的聯合。使用內部連接:

direct = db.session.query(ChangelogEntry).\ 
    join("apps").\ 
    filter(App.name == "App3") 

groups = db.session.query(ChangelogEntry).\ 
    join("appGroups", "apps").\ 
    filter(App.name == "App3") 

direct.union(groups).all() 

因爲多對多關係的羣組中加入可能會產生一個changelog的項目多行,但使用UNION而不是UNION ALL採取的照顧。爲避免重複行開始,您可以使用semijoins/EXISTS:

direct = db.session.query(ChangelogEntry).\ 
    filter(ChangelogEntry.apps.any(App.name == "App3")) 

groups = db.session.query(ChangelogEntry).\ 
    filter(ChangelogEntry.appGroups.any(
     AppGroup.apps.any(App.name == "App3"))) 

direct.union(groups).all() 
+0

謝謝。我是sql和sqlalchemy的新手。你能告訴我什麼加入(「應用程序」)/加入(「appGroups」,「應用程序」)。 (我現在已經是什麼連接了) –

+1

看看[Query.join()](http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join )文件。簡而言之,在單個實體查詢中,您可以將用作聯接的on子句的關係作爲字符串傳遞。您還可以生成連接鏈,例如'join(「appGroups」,「apps」)',它等同於'連接(ChangelogEntry.appGroups).join(AppGroup.apps)'。當你通過一個多對多的關係作爲on子句時,SQLAlchemy爲你在後臺形成所需的關聯表連接。 –