【问题标题】:SQL Alchemy Querying Across Star SchemaSQLAlchemy 跨星型模式查询
【发布时间】:2015-06-04 02:18:02
【问题描述】:

我正在尝试使用 SQL alchemy 映射现有的星型模式数据库,但在构建联接时遇到了麻烦。我已经阅读了文档和堆栈溢出,但没有找到明确的答案。

这是我的课程的简单布局。 School 和 Student 是具有上下文信息的不同维度表。 StudentScore 是一个多对多关联表的事实表,每个学生评估都有一行。

class School(Base):
    __tablename__ = 'DimSchool'

    id = Column('SchoolKey', Integer, primary_key=True)
    name = Column('SchoolName', String)
    district = Column('SchoolDistrict', String)

class Student(Base):
    __tablename__ = 'DimStudent'

    id = Column('StudentKey',Integer, primary_key=True)
    srcstudentid = ('SrcStudentId', Integer)
    firstname = Column('FirstName', String)
    middlename = Column('MiddleName', String)    
    lastname = Column('LastName', String)

class StudentScore(Base):
    __tablename__ = 'FactStudentScore'

    StudentKey = Column('StudentKey', Integer, ForeignKey('DimStudent.StudentKey'), primary_key = True)
    SchoolKey = Column('SchoolKey', Integer, ForeignKey('DimSchool.SchoolKey'), primary_key = True)
    PointsPossible = Column('PointsPossible', Integer)
    PointsReceived = Column('PointsReceived', Integer)

    student = relationship("Student", backref='studentscore')
    school = relationship("School", backref='studentscore')

我正在尝试查询给定的学校,加入 StudentScore 和 Student 以返回每个学生的一行,以及他们的分数和学校关联。最终,我会将其放入 pandas 数据框中。有人可以提供一个明确的例子来说明如何做到这一点吗?

谢谢!

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    对于多对多关系,使用 secondary=... 参数到 relationship() 并将其指向关联表。看 http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#many-to-many 一个完整的例子。

    如果联结表包含附加数据,带有关联对象和关联代理的更高级的模式使客户端代码相对简单。请参阅http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html 以获取与原始问题中的案例类似的示例。

    【讨论】:

    • 如果中间表还包含我想要的信息和属性,这是否仍然相关?学生在测试中获得的分数会保存在此处的关联表中。
    • 是的,这正是关联对象(和代理)的用途。点击链接并继续阅读下一部分。 :) 我已经更新了我的答案,也指向了关联代理。
    • 就像一个魅力。关联代理正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多