ホームページ >バックエンド開発 >Python チュートリアル >Python での SQLAlchemy リレーショナル操作の概要 (コード付き)

Python での SQLAlchemy リレーショナル操作の概要 (コード付き)

不言
不言転載
2018-10-23 16:50:132550ブラウズ
この記事では、Python での SQLAlchemy リレーショナル操作の概要 (コード付き) を紹介します。これには特定の参考値があります。必要な友人は参照できます。お役に立てば幸いです。

リレーショナル データベースはリレーショナル モデルに基づいたデータベースであるため、データベース プログラミングではテーブル間の関係が特に重要です。このセクションでは、読者が SQLAlchemy のリレーションシップ操作をすぐにマスターできるように、SQLAlchemy でリレーションシップを定義する方法と、リレーションシップを使用してクエリを実行する方法に焦点を当てます。

1. ケース

3 つのエンティティ テーブル: クラス テーブル、学生テーブル、教師テーブル、および 1 つのリレーショナル テーブル: class_Teacher を設計します。クラスと生徒の間には 1 対多の関係があり、クラスと教師の間には多対多の関係があります。

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 パラメータはオプションのパラメータです。backref が設定されている場合、このステートメントは親テーブルから子テーブルへの参照も設定します。

  • 1 対多の関係の使用: 将来的には、students 属性を通じて、関連するクラスのすべての学生の情報を直接取得できるようになります。次のコードは、クラス [クラス 3、クラス 2] のすべての生徒情報を出力できます。

class=session.query(Class).filter(Clss.name=="三年二班").first()

for student in class_.students:
    print(student)
  • 多対多の関係の使用: 関連するモデル ClassTeacher を通じて実装され、モデル Class と Teacher の外部キーがそれぞれ設定されます。と親モデルに設定される 対応関係が実装されます。多対多の関係は、2 つの親テーブル間の多対 1 の関係を実装する関連付けテーブルとして考えることもできます。クラスと教師の間には多対多の関係があります。次のコードは、クラス内のすべての教師の情報を出力できます [クラス 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 は、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,)

If you need to外部キー以外の他のフィールドを結合時に使用します。接続条件は開発者が設定する必要があります。以下は、クラスアドレスが学生のアドレスと同じである学生の名前を出力します。

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 ステートメントに自動的に変換されます:

SELECT student.name AS student_name, FROM student JOIN class ON student.address=class.address

以上がPython での SQLAlchemy リレーショナル操作の概要 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。