微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLAlchemy / Elixir-查询以检查实体在多对多关系列表中的成员资格

如何解决SQLAlchemy / Elixir-查询以检查实体在多对多关系列表中的成员资格

| 我正在尝试构造一个sqlalchemy查询,以获取作为MIT助理教授的所有教授的姓名列表。请注意,某个课程可能有多位助理教授。 我想做的大致相当于:
uni_mit = University.get_by(name=\'MIT\')
s = select([Professor.name],and_(Professor.in_(Course.assistants),Course.university = uni_mit))
session.execute(s)
这是行不通的,因为
in_
仅用于实体的字段,而不是整个实体。我也尝试了3英镑,但我也没有工作。 我的Elixir模型是:
class Course(Entity):
    id = Field(Integer,primary_key=True)
    assistants = ManyToMany(\'Professor\',inverse=\'courses_assisted\',ondelete=\'cascade\')
    university = ManyToOne(\'University\')
    ..

class Professor(Entity):
    id = Field(Integer,primary_key=True)
    name = Field(String(50),required=True)
    courses_assisted = ManyToMany(\'Course\',inverse=\'assistants\',ondelete=\'cascade\')
    ..
如果我可以访问中间的多对多实体,那么这将是微不足道的(条件是
and_(interm_table.prof_id = Professor.id,interm_table.course = Course.id)
,但是sqlAlchemy显然对我隐藏了此表。 我正在使用Elixir 0.7和sqlAlchemy 0.6。 顺便说一句:这个问题不同于sqlalchemy + elixir:如何与ManyToMany关系进行查询?因为我需要对照所有满足条件的课程来检查教授,而不是一个静态的课程。     

解决方法

        您可以在中间表中找到Elixir将其隐藏的地方,但是请注意,该表使用了完全限定的列名(例如
__package_path_with_underscores__course_id
)。为避免这种情况,请使用定义您的ManyToMany
class Course(Entity):
    ...
    assistants = ManyToMany(\'Professor\',inverse=\'courses_assisted\',local_colname=\'course_id\',remote_colname=\'prof_id\',ondelete=\'cascade\')
然后您可以使用
rel = Course._descriptor.find_relationship(\'assistants\')
assert rel
table = rel.table
并可以使用
table.c.prof_id
等访问列。 更新:当然,您可以在更高级别上执行此操作,但不能在单个查询中执行此操作,因为SQLAlchemy尚不支持
in_
的关系。例如,有两个查询:
>>> mit_courses = set(Course.query.join(
... University).filter(University.name == \'MIT\'))
>>> [p.name for p in Professor.query if set(
... p.courses_assisted).intersection(mit_courses)]
或者,或者:
>>> plist = [c.assistants for c in Course.query.join(
... University).filter(University.name == \'MIT\')]
>>> [p.name for p in set(itertools.chain(*plist))]
第一步创建助手列表。第二步拉平列表的列表,并通过设置集合来删除重复项。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。