1+ """Mirrors sqlalchemy/test/orm/inheritance/test_concrete.py :: ConcreteTest, PropertyInheritanceTest"""
2+
3+ from typing import Optional
4+
5+ from sqlmodel import Field , Relationship , Session , SQLModel , create_engine , select
6+
7+
8+ def test_basic ():
9+ # mirrors ConcreteTest.test_basic
10+ class Manager (SQLModel , table = True ):
11+ __tablename__ = "cti_managers"
12+ employee_id : Optional [int ] = Field (default = None , primary_key = True )
13+ name : str
14+ manager_data : str
15+
16+ class Engineer (SQLModel , table = True ):
17+ __tablename__ = "cti_engineers"
18+ employee_id : Optional [int ] = Field (default = None , primary_key = True )
19+ name : str
20+ engineer_info : str
21+
22+ engine = create_engine ("sqlite:///:memory:" )
23+ SQLModel .metadata .create_all (engine )
24+
25+ with Session (engine ) as db :
26+ db .add (Manager (name = "Sally" , manager_data = "knows how to manage things" ))
27+ db .add (Engineer (name = "Karina" , engineer_info = "knows how to hack" ))
28+ db .commit ()
29+
30+ with Session (engine ) as db :
31+ managers = db .exec (select (Manager )).all ()
32+ engineers = db .exec (select (Engineer )).all ()
33+
34+ db .expire (managers [0 ], ["manager_data" ])
35+ assert managers [0 ].manager_data == "knows how to manage things"
36+
37+ assert {m .name for m in managers } == {"Sally" }
38+ assert {e .name for e in engineers } == {"Karina" }
39+
40+
41+ def test_multi_level_no_base ():
42+ # mirrors ConcreteTest.test_multi_level_no_base
43+ class Manager (SQLModel , table = True ):
44+ __tablename__ = "cti3_managers"
45+ employee_id : Optional [int ] = Field (default = None , primary_key = True )
46+ name : str
47+ manager_data : str
48+
49+ class Engineer (SQLModel , table = True ):
50+ __tablename__ = "cti3_engineers"
51+ employee_id : Optional [int ] = Field (default = None , primary_key = True )
52+ name : str
53+ engineer_info : str
54+
55+ class Hacker (SQLModel , table = True ):
56+ __tablename__ = "cti3_hackers"
57+ employee_id : Optional [int ] = Field (default = None , primary_key = True )
58+ name : str
59+ engineer_info : str
60+ nickname : str
61+
62+ engine = create_engine ("sqlite:///:memory:" )
63+ SQLModel .metadata .create_all (engine )
64+
65+ with Session (engine ) as db :
66+ db .add (Manager (name = "Sally" , manager_data = "knows how to manage things" ))
67+ db .add (Engineer (name = "Jenn" , engineer_info = "knows how to program" ))
68+ db .add (Hacker (name = "Karina" , engineer_info = "knows how to hack" , nickname = "Badass" ))
69+ db .commit ()
70+
71+ with Session (engine ) as db :
72+ managers = db .exec (select (Manager )).all ()
73+ engineers = db .exec (select (Engineer )).all ()
74+ hackers = db .exec (select (Hacker )).all ()
75+
76+ assert len (managers ) == 1 and managers [0 ].name == "Sally"
77+ assert len (engineers ) == 1 and engineers [0 ].engineer_info == "knows how to program"
78+ assert len (hackers ) == 1 and hackers [0 ].nickname == "Badass"
79+
80+ with Session (engine ) as db :
81+ assert db .exec (select (Manager ).where (Manager .name == "Karina" )).first () is None
82+
83+
84+ def test_relationship ():
85+ # mirrors ConcreteTest.test_relationship / PropertyInheritanceTest
86+ class Company (SQLModel , table = True ):
87+ __tablename__ = "cti4_companies"
88+ id : Optional [int ] = Field (default = None , primary_key = True )
89+ name : str
90+ managers : list ["CtiManager" ] = Relationship (back_populates = "company" )
91+ engineers : list ["CtiEngineer" ] = Relationship (back_populates = "company" )
92+
93+ class CtiManager (SQLModel , table = True ):
94+ __tablename__ = "cti4_managers"
95+ employee_id : Optional [int ] = Field (default = None , primary_key = True )
96+ name : str
97+ manager_data : str
98+ company_id : Optional [int ] = Field (default = None , foreign_key = "cti4_companies.id" )
99+ company : Optional [Company ] = Relationship (back_populates = "managers" )
100+
101+ class CtiEngineer (SQLModel , table = True ):
102+ __tablename__ = "cti4_engineers"
103+ employee_id : Optional [int ] = Field (default = None , primary_key = True )
104+ name : str
105+ engineer_info : str
106+ company_id : Optional [int ] = Field (default = None , foreign_key = "cti4_companies.id" )
107+ company : Optional [Company ] = Relationship (back_populates = "engineers" )
108+
109+ engine = create_engine ("sqlite:///:memory:" )
110+ SQLModel .metadata .create_all (engine )
111+
112+ with Session (engine ) as db :
113+ corp = Company (name = "Initech" )
114+ db .add (corp )
115+ db .flush ()
116+ cid = corp .id
117+ db .add (CtiManager (name = "Bill" , manager_data = "TPS reports" , company_id = cid ))
118+ db .add (CtiEngineer (name = "Peter" , engineer_info = "cubicle dweller" , company_id = cid ))
119+ db .commit ()
120+
121+ with Session (engine ) as db :
122+ corp = db .get (Company , cid )
123+ assert len (corp .managers ) == 1 and corp .managers [0 ].name == "Bill"
124+ assert len (corp .engineers ) == 1 and corp .engineers [0 ].name == "Peter"
0 commit comments