>  기사  >  백엔드 개발  >  Python에서의 SQLAlchemy 관계 연산 소개(코드 포함)

Python에서의 SQLAlchemy 관계 연산 소개(코드 포함)

不言
不言앞으로
2018-10-23 16:50:132495검색
이 기사는 Python에서의 SQLAlchemy 관계형 연산(코드 포함)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

관계형 데이터베이스는 관계형 모델을 기반으로 하는 데이터베이스이므로 데이터베이스 프로그래밍에서는 테이블 간의 관계가 특히 중요합니다. 이 섹션에서는 독자가 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)
위 코드에서 class_teacher.teacher는 역참조입니다. 모델 Teacher의 ClassTeacher에 대해 정의되었습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제