관계형 데이터베이스는 관계형 모델을 기반으로 하는 데이터베이스이므로 데이터베이스 프로그래밍에서는 테이블 간의 관계가 특히 중요합니다. 이 섹션에서는 독자가 SQLAlchemy의 관계 작업을 빠르게 익힐 수 있도록 SQLAlchemy에서 관계를 정의하는 방법과 관계를 사용하여 쿼리를 수행하는 방법에 중점을 둡니다.
1. 사례
3개의 엔터티 테이블: 수업 테이블, 학생 테이블, 학생 테이블, 교사 테이블 및 1개의 관계 테이블: class_teacher를 디자인합니다. 수업과 학생 사이에는 일대다 관계가 있고, 수업과 교사 사이에는 다대다 관계가 있습니다.
from sqlalchemy import Table,Column,Integer,ForeignKey,String from sqlalchemy.orm import relationship,backref from sqlalchemy.ext.declarative import declarative_base Base=declarative_base() class Class(Base): __tablename__='class' class_id=Column(Integer,primary_key=True) name=Column(String(50)) level=Column(Integer) address=Column(String(50)) class_teachers=relationship("ClassTeacher",backref="class") students=relationship("Student",backref="class") class Student(Base): __tablename__='student' student_id=Column(Integer,primary_key=True) name=Column(String(50)) age=Column(Integer) gender=Column(String(10)) address=Column(String(50)) class_id=Column(Integer,ForeignKey('class.id')) class Teacher(Base): __tablename__='teacher' teacher_id=Column(Integer,primary_key=True) name=Column(String(50)) gender=Column(String(10)) telephone=Column(String(50)) address=Column(String(50)) class_teachers=relationship("ClassTeacher",backref="teacher") class ClassTeacher(Base): __tablename__='class_teacher' teacher_id=Column(Integer,ForeignKey('teacher.teacher_id'),primary_key=True) class_id=Column(Integer,ForeignKey("class.id"),primary_key=True)
코드는 4개의 SQLAlchemy 모델을 사용하여 4개의 테이블을 정의합니다. 관계 정의와 관련된 부분은 다음과 같습니다.
외래 키 설정: 열 정의에서 외래 키 세트의 열에 ForeignKey를 전달합니다. 위로.
class_id=Column(Integer,ForeignKey('class.id'))
관계 설정: 관계 키워드를 통해 상위 모델의 단어 테이블에 대한 참조를 설정합니다. 예를 들어 클래스 모델의 관계 설정은 다음과 같습니다.
students=relationship("Student",backref="calss")
역참조 매개변수는 선택적 매개변수입니다. backref를 설정하면 이 문은 상위 테이블에서 하위 테이블로의 참조도 설정합니다.
일대다 관계 활용: 앞으로는 학생 속성을 통해 해당 수업에 속한 모든 학생의 정보를 직접 얻을 수 있습니다. 다음 코드는 [Class 3, Class 2] 클래스의 모든 학생 정보를 출력할 수 있습니다.
class=session.query(Class).filter(Clss.name=="三年二班").first() for student in class_.students: print(student)
다대다 관계 사용: 모델 Class와 Teacher의 외래 키가 각각 설정되고 해당 관계 구현이 상위 모델에 설정되는 관련 모델 ClassTeacher를 통해 구현됩니다. 다대다 관계는 두 상위 테이블 간의 다대일 관계를 구현하는 연관 테이블로 생각할 수도 있습니다. 수업과 교사 사이에는 다대다 관계가 있습니다. 다음 코드는 수업 [2학년, 3학년]의 모든 교사의 정보를 인쇄할 수 있습니다.
class=session.query(Class).filter(Class.name=="三年二班").first() for class_teacher in class_.class_teachers: teacher=class_teacher.teacher print(teacher)
2. 연결 쿼리
실제 개발에서는 관계가 있을 때 다중 테이블 연결 쿼리가 반드시 필요합니다. 다음은 다중 테이블 조인 쿼리를 수행하는 방법을 보여주는 실제 예입니다.
쿼리문에 Join 키워드를 사용하여 연결 쿼리를 수행하고 모든 3학년 학생의 이름을 출력할 수 있습니다.
students=session.query(Student).join(Class).filter(Class.level==3).all() for student in students: print(student.namr)
위 쿼리 함수는 자동으로 외래 키 관계를 연결 조건으로 사용하며, 쿼리는 SQLAlchemy에 의해 자동으로 다음 SQL 문으로 변환되고 실행됩니다.
SELECT student.student_id AS student_student_id, student.name AS student.name, student.age AS student.age, student.gender AS student.gender, student.address AS student.address, student.class_id AS student_class_id FROM student JOIN class ON student.class_id=class.class_id WHERE class.leve=? (3,)
연결된 테이블의 내용을 인쇄해야 하는 경우 쿼리에 여러 테이블 개체를 지정할 수 있습니다.
다음 명령문은 모든 3학년 학생의 이름과 수업 이름을 인쇄합니다.
for student,class_ in session.query(Student,Class).join(Class).filter(Class.level==3).all(): print(student.name,class_.name)
위 쿼리 함수는 자동으로 외래 키 관계를 연결 조건으로 사용합니다. 쿼리는 SQLAlchemy에 의해 자동으로 다음 SQL 문으로 변환되어 실행됩니다.
SELECT student.student_id AS student_student_id, student.name AS student.name, student.age AS student.age, student.gender AS student.gender, student.address AS student.address, student.class_id AS student_class_id, class.class_id AS class_class_id, class.name AS class_name, class.level AS class_level, class.address AS class_location FROM student JOIN class ON student.class_id=class.class_id WHERE class.leve=? (3,)
외래 키 이외의 다른 필드를 연결로 사용해야 하는 경우 조건이 있는 경우 개발자가 조인에서 직접 설정해야 합니다. 다음은 학급 주소가 학생의 주소와 동일한 학생의 이름을 출력합니다.
for student_name, in session.query(Student.name).join(Class,Class.address==Student.address).filter(Class.level==3).all(): print(student_name)
위 쿼리 함수는 개발자가 연결 조건으로 지정한 명령문을 사용하며, 쿼리되는 필드를 직접 지정하므로 결과가 줄어듭니다. 실제 SQL의 단계 수 쿼리된 필드는 성능을 향상시킵니다. 쿼리는 실행을 위해 SQLAlchemy에 의해 자동으로 다음 SQL 문으로 변환됩니다.
위 내용은 Python에서의 SQLAlchemy 관계 연산 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!