feat: add mapper for student and it loads
This commit is contained in:
		| @@ -1,9 +1,12 @@ | ||||
| from sqlalchemy import Column, MetaData, String, Table | ||||
| from sqlalchemy.orm import mapper | ||||
| from sqlalchemy import Column, ForeignKey, MetaData, String, Table | ||||
| from sqlalchemy.orm import backref, registry, relationship | ||||
|  | ||||
| from backend.model.assessment import Assessment | ||||
| from backend.model.student import Student | ||||
| from backend.model.tribe import Tribe | ||||
|  | ||||
| metadata = MetaData() | ||||
| mapper_registry = registry() | ||||
|  | ||||
| tribes_table = Table( | ||||
|     "tribes", | ||||
| @@ -12,6 +15,35 @@ tribes_table = Table( | ||||
|     Column("level", String(255)), | ||||
| ) | ||||
|  | ||||
| assessments_table = Table( | ||||
|     "assessments", | ||||
|     metadata, | ||||
|     Column("id", String(255), primary_key=True), | ||||
|     Column("name", String(255)), | ||||
|     Column("tribe_name", String(255), ForeignKey("tribes.name")), | ||||
| ) | ||||
|  | ||||
| students_table = Table( | ||||
|     "students", | ||||
|     metadata, | ||||
|     Column("id", String(255), primary_key=True), | ||||
|     Column("name", String(255)), | ||||
|     Column("tribe_name", String(255), ForeignKey("tribes.name")), | ||||
| ) | ||||
|  | ||||
|  | ||||
| def start_mappers(): | ||||
|     tribes_mapper = mapper(Tribe, tribes_table) | ||||
|     tribes_mapper = mapper_registry.map_imperatively( | ||||
|         Tribe, | ||||
|         tribes_table, | ||||
|         properties={ | ||||
|             "students": relationship( | ||||
|                 Student, backref="tribes", order_by=students_table.c.id | ||||
|             ), | ||||
|             "assessments": relationship( | ||||
|                 Assessment, backref="tribes", order_by=assessments_table.c.id | ||||
|             ), | ||||
|         }, | ||||
|     ) | ||||
|     students_mapper = mapper_registry.map_imperatively(Student, students_table) | ||||
|     assessments_mapper = mapper_registry.map_imperatively(Assessment, assessments_table) | ||||
|   | ||||
| @@ -20,3 +20,6 @@ class Student: | ||||
|         if isinstance(other, Student): | ||||
|             return self.id == other.id | ||||
|         return False | ||||
|  | ||||
|     def __hash__(self) -> int: | ||||
|         return hash(self.id) | ||||
|   | ||||
| @@ -26,8 +26,5 @@ class Tribe: | ||||
|             return self.name == other.name | ||||
|         return False | ||||
|  | ||||
|     def __repr__(self) -> str: | ||||
|         return f"<Tribe {self.name=}>" | ||||
|  | ||||
|     def to_dict(self) -> dict: | ||||
|         return {"name": self.name, "level": self.level} | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| from backend.adapters.orm import metadata, start_mappers | ||||
| from backend.model.student import Student | ||||
| from backend.model.tribe import Tribe | ||||
|  | ||||
|  | ||||
| @@ -40,3 +41,25 @@ def test_tribe_mapper_can_save_and_load_tribe(session): | ||||
|     session.commit() | ||||
|  | ||||
|     assert session.query(Tribe).all() == [tribe] | ||||
|  | ||||
|  | ||||
| def test_students_mapper_can_load_student(session): | ||||
|     session.execute("INSERT INTO tribes (name, level) VALUES " "('tribe1', '2nd')") | ||||
|  | ||||
|     session.execute( | ||||
|         "INSERT INTO students (id, name, tribe_name) VALUES " | ||||
|         "('1', 'student1', 'tribe1')," | ||||
|         "('2', 'student2', 'tribe1')" | ||||
|     ) | ||||
|  | ||||
|     tribe = session.query(Tribe).one() | ||||
|     expected = [ | ||||
|         (Student("1", "student1", tribe)), | ||||
|         (Student("2", "student2", tribe)), | ||||
|     ] | ||||
|  | ||||
|     with session.no_autoflush: | ||||
|         students = session.query(Student).all() | ||||
|  | ||||
|     assert set(tribe.students) == set(expected) | ||||
|     assert students == expected | ||||
|   | ||||
		Reference in New Issue
	
	Block a user