Python 使用元素列表的SQLAlchemy查询

Python 使用元素列表的SQLAlchemy查询,python,sql,sqlalchemy,flask-sqlalchemy,Python,Sql,Sqlalchemy,Flask 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_changelogEnt

我已经建立了一个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)
更新:

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'))
)
一个应用程序可以是多个应用程序组的一部分,用户可以创建ChangelogEntry,并可以选择此ChangelogEntry所属的应用程序和/或应用程序组

看起来是这样的:

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)

好的。我只想获取属于例如App3(App3是AppGroups Group1和Group2的一部分)以及本例中Group1和Group2的所有ChangelogEntries


我希望你能帮我

联合可能与手头的任务非常匹配:通过组查找具有直接应用程序关系的变更日志项的联合。使用内部联接:

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会解决这一问题。为了避免重复行,可以使用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()

请同时包括关联表。我是否正确理解您的意思,因为您希望查询与给定应用程序有直接关系的变更日志条目,以及与包含给定应用程序的组有关系的变更日志条目?我现在包括了关联表。我希望现在更容易理解。但是你是对的,这就是我想要的……谢谢。我不熟悉sql和sqlalchemy。你能告诉我join(“应用程序”)/join(“应用程序组”、“应用程序”)是做什么的吗。(我现在已经知道了连接是什么)看看文档。简言之,在单个实体查询中,可以将用作连接的on子句的关系作为字符串传递。您还可以生成连接链,例如
join(“appGroups”、“apps”)
,它相当于
join(ChangelogEntry.appGroups)。join(AppGroup.apps)
。当您将多对多关系作为on子句传递时,SQLAlchemy会在后台为您处理形成所需的关联表联接。