在sqlalchemy中进行自然连接

1 投票
1 回答
896 浏览
提问于 2025-04-18 01:24

在sqlalchemy中,连接(join)是怎么工作的呢?

class Enrollments(Base):
    __tablename__ = 'Enrollments'
    StudentID = Column(INTEGER, ForeignKey('Student.StudentID'))
    FinalGrade = Column(VARCHAR(3))



class Student(Base):
    __tablename__ = 'Student'

    StudentID = Column(INTEGER, primary_key=True)
    Name = Column(VARCHAR(100))
    EnrolledIn = relationship('Enrollments')


 session.query(Student).join(Enrollments).all() #what isn't giving me what I expect

我本来期待这个操作能给我三列数据(学生ID、姓名、最终成绩、注册课程),但是它只给了我学生对象,没有附带应该有的注册信息,我哪里做错了呢?

1 个回答

2

每个 Student 对象都有一个与之关联的注册信息,叫做 student.EnrolledIn

不过,连接(joins)是用来查询数据的,而不是用来获取数据的;如果你想要提前加载这些信息,你需要

session.query(Student).options(joinedload(Student.EnrolledIn))

关于关系加载的详细说明可以在这里找到: http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#eager-loading

顺便提一下,你可能想给对象的属性使用 snake_case 这种命名方式;因为 DromedaryCase 通常只用来命名类,所以用起来会让人有点困惑 :)

撰写回答