Sqlalchemy-orm-many-to-many-relationships
多対多の関係
2つのテーブル間の多対多の関係*は、2つの外部キー(各テーブルの主キーから1つ)を持つように関連付けテーブルを追加することで実現されます さらに、2つのテーブルにマッピングするクラスには、relationship()関数の2次属性として割り当てられた他の関連付けテーブルのオブジェクトのコレクションを持つ属性があります。
この目的のために、部門と従業員という2つのテーブルを持つSQLiteデータベース(mycollege.db)を作成します。 ここでは、従業員は複数の部門の一部であり、部門には複数の従業員がいると想定しています。 これは、多対多の関係を構成します。
部門および従業員テーブルにマッピングされる従業員および部門クラスの定義は次のとおりです-
ここで、Linkクラスを定義します。 リンクテーブルにリンクされ、department_idおよびemployee_id属性が含まれています。それぞれ、departmentおよびemployeeテーブルのプライマリキーを参照しています。
ここで、DepartmentクラスにはEmployeeクラスに関連するemployees属性があることに注意する必要があります。 関係関数の2次属性には、値としてリンクが割り当てられます。
同様に、Employeeクラスには、Departmentクラスに関連するdepartments属性があります。 関係関数の2次属性には、値としてリンクが割り当てられます。
これらの3つのテーブルはすべて、次のステートメントが実行されるときに作成されます-
Pythonコンソールは、次のCREATE TABLEクエリを出力します-
これを確認するには、以下のスクリーンショットに示すように、SQLiteStudioを使用してmycollege.dbを開きます-
次に、以下に示すように、Departmentクラスの3つのオブジェクトとEmployeeクラスの3つのオブジェクトを作成します-
各テーブルには、append()メソッドを持つコレクション属性があります。 EmployeeオブジェクトをDepartmentオブジェクトのEmployeesコレクションに追加できます。 同様に、Employeeオブジェクトのdepartmentsコレクション属性にDepartmentオブジェクトを追加できます。
私たちが今しなければならないのは、セッションオブジェクトを設定し、それにすべてのオブジェクトを追加し、以下に示すように変更をコミットすることです-
次のSQLステートメントがPythonコンソールに出力されます-
上記の操作の効果を確認するには、SQLiteStudioを使用して、部門、従業員、およびリンクテーブルのデータを表示します-
データを表示するには、次のクエリステートメントを実行します-
この例で入力されたデータに従って、出力は以下のように表示されます-