Skip to content

Commit 60318b4

Browse files
committed
migration to sqlalchemy 2.0
1 parent 43a689d commit 60318b4

File tree

10 files changed

+46
-77
lines changed

10 files changed

+46
-77
lines changed

docs_src/tutorial/many_to_many/tutorial003.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,12 @@
33
from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, select
44

55

6-
class HeroTeamLink(SQLModel, table=True):
7-
team_id: Optional[int] = Field(
8-
default=None, foreign_key="team.id", primary_key=True
9-
)
10-
hero_id: Optional[int] = Field(
11-
default=None, foreign_key="hero.id", primary_key=True
12-
)
13-
is_training: bool = False
14-
15-
team: "Team" = Relationship(back_populates="hero_links")
16-
hero: "Hero" = Relationship(back_populates="team_links")
17-
18-
196
class Team(SQLModel, table=True):
207
id: Optional[int] = Field(default=None, primary_key=True)
218
name: str = Field(index=True)
229
headquarters: str
2310

24-
hero_links: List[HeroTeamLink] = Relationship(back_populates="team")
11+
hero_links: List["HeroTeamLink"] = Relationship(back_populates="team")
2512

2613

2714
class Hero(SQLModel, table=True):
@@ -30,7 +17,20 @@ class Hero(SQLModel, table=True):
3017
secret_name: str
3118
age: Optional[int] = Field(default=None, index=True)
3219

33-
team_links: List[HeroTeamLink] = Relationship(back_populates="hero")
20+
team_links: List["HeroTeamLink"] = Relationship(back_populates="hero")
21+
22+
23+
class HeroTeamLink(SQLModel, table=True):
24+
team_id: Optional[int] = Field(
25+
default=None, foreign_key="team.id", primary_key=True
26+
)
27+
hero_id: Optional[int] = Field(
28+
default=None, foreign_key="hero.id", primary_key=True
29+
)
30+
is_training: bool = False
31+
32+
team: "Team" = Relationship(back_populates="hero_links")
33+
hero: "Hero" = Relationship(back_populates="team_links")
3434

3535

3636
sqlite_file_name = "database.db"

docs_src/tutorial/relationship_attributes/back_populates/tutorial003.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,21 @@
33
from sqlmodel import Field, Relationship, SQLModel, create_engine
44

55

6+
class Hero(SQLModel, table=True):
7+
id: Optional[int] = Field(default=None, primary_key=True)
8+
name: str = Field(index=True)
9+
secret_name: str
10+
age: Optional[int] = Field(default=None, index=True)
11+
12+
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
13+
team: Optional["Team"] = Relationship(back_populates="heroes")
14+
15+
weapon_id: Optional[int] = Field(default=None, foreign_key="weapon.id")
16+
weapon: Optional["Weapon"] = Relationship(back_populates="hero")
17+
18+
powers: List["Power"] = Relationship(back_populates="hero")
19+
20+
621
class Weapon(SQLModel, table=True):
722
id: Optional[int] = Field(default=None, primary_key=True)
823
name: str = Field(index=True)
@@ -26,21 +41,6 @@ class Team(SQLModel, table=True):
2641
heroes: List["Hero"] = Relationship(back_populates="team")
2742

2843

29-
class Hero(SQLModel, table=True):
30-
id: Optional[int] = Field(default=None, primary_key=True)
31-
name: str = Field(index=True)
32-
secret_name: str
33-
age: Optional[int] = Field(default=None, index=True)
34-
35-
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
36-
team: Optional[Team] = Relationship(back_populates="heroes")
37-
38-
weapon_id: Optional[int] = Field(default=None, foreign_key="weapon.id")
39-
weapon: Optional[Weapon] = Relationship(back_populates="hero")
40-
41-
powers: List[Power] = Relationship(back_populates="hero")
42-
43-
4444
sqlite_file_name = "database.db"
4545
sqlite_url = f"sqlite:///{sqlite_file_name}"
4646

pyproject.toml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ classifiers = [
1717
"Intended Audience :: System Administrators",
1818
"License :: OSI Approved :: MIT License",
1919
"Programming Language :: Python :: 3 :: Only",
20-
"Programming Language :: Python :: 3.6",
2120
"Programming Language :: Python :: 3.7",
2221
"Programming Language :: Python :: 3.8",
2322
"Programming Language :: Python :: 3.9",
@@ -30,10 +29,9 @@ classifiers = [
3029
]
3130

3231
[tool.poetry.dependencies]
33-
python = "^3.6.1"
34-
SQLAlchemy = ">=1.4.17,<=1.4.41"
32+
python = "^3.7"
33+
SQLAlchemy = ">=2.0.0,<=2.0.5.post1"
3534
pydantic = "^1.8.2"
36-
sqlalchemy2-stubs = {version = "*", allow-prereleases = true}
3735

3836
[tool.poetry.dev-dependencies]
3937
pytest = "^7.0.1"

sqlmodel/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from sqlalchemy.schema import PrimaryKeyConstraint as PrimaryKeyConstraint
2222
from sqlalchemy.schema import Sequence as Sequence
2323
from sqlalchemy.schema import Table as Table
24-
from sqlalchemy.schema import ThreadLocalMetaData as ThreadLocalMetaData
2524
from sqlalchemy.schema import UniqueConstraint as UniqueConstraint
2625
from sqlalchemy.sql import alias as alias
2726
from sqlalchemy.sql import all_ as all_
@@ -71,7 +70,6 @@
7170
from sqlalchemy.sql import outerjoin as outerjoin
7271
from sqlalchemy.sql import outparam as outparam
7372
from sqlalchemy.sql import over as over
74-
from sqlalchemy.sql import subquery as subquery
7573
from sqlalchemy.sql import table as table
7674
from sqlalchemy.sql import tablesample as tablesample
7775
from sqlalchemy.sql import text as text

sqlmodel/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,7 @@ class SQLModel(BaseModel, metaclass=SQLModelMetaclass, registry=default_registry
478478
__sqlmodel_relationships__: ClassVar[Dict[str, RelationshipProperty]] # type: ignore
479479
__name__: ClassVar[str]
480480
metadata: ClassVar[MetaData]
481+
__allow_unmapped__ = True # https://docs.sqlalchemy.org/en/20/changelog/migration_20.html#migration-20-step-six
481482

482483
class Config:
483484
orm_mode = True

sqlmodel/sql/expression.py

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,12 @@ class _Py36SelectOfScalar(_Select, Generic[_TSelect], metaclass=GenericSelectMet
138138

139139

140140
@overload
141-
def select(entity_0: _TScalar_0, **kw: Any) -> SelectOfScalar[_TScalar_0]: # type: ignore
141+
def select(entity_0: _TScalar_0) -> SelectOfScalar[_TScalar_0]: # type: ignore
142142
...
143143

144144

145145
@overload
146-
def select(entity_0: Type[_TModel_0], **kw: Any) -> SelectOfScalar[_TModel_0]: # type: ignore
146+
def select(entity_0: Type[_TModel_0]) -> SelectOfScalar[_TModel_0]: # type: ignore
147147
...
148148

149149

@@ -154,7 +154,6 @@ def select(entity_0: Type[_TModel_0], **kw: Any) -> SelectOfScalar[_TModel_0]:
154154
def select( # type: ignore
155155
entity_0: _TScalar_0,
156156
entity_1: _TScalar_1,
157-
**kw: Any,
158157
) -> Select[Tuple[_TScalar_0, _TScalar_1]]:
159158
...
160159

@@ -163,7 +162,6 @@ def select( # type: ignore
163162
def select( # type: ignore
164163
entity_0: _TScalar_0,
165164
entity_1: Type[_TModel_1],
166-
**kw: Any,
167165
) -> Select[Tuple[_TScalar_0, _TModel_1]]:
168166
...
169167

@@ -172,7 +170,6 @@ def select( # type: ignore
172170
def select( # type: ignore
173171
entity_0: Type[_TModel_0],
174172
entity_1: _TScalar_1,
175-
**kw: Any,
176173
) -> Select[Tuple[_TModel_0, _TScalar_1]]:
177174
...
178175

@@ -181,7 +178,6 @@ def select( # type: ignore
181178
def select( # type: ignore
182179
entity_0: Type[_TModel_0],
183180
entity_1: Type[_TModel_1],
184-
**kw: Any,
185181
) -> Select[Tuple[_TModel_0, _TModel_1]]:
186182
...
187183

@@ -191,7 +187,6 @@ def select( # type: ignore
191187
entity_0: _TScalar_0,
192188
entity_1: _TScalar_1,
193189
entity_2: _TScalar_2,
194-
**kw: Any,
195190
) -> Select[Tuple[_TScalar_0, _TScalar_1, _TScalar_2]]:
196191
...
197192

@@ -201,7 +196,6 @@ def select( # type: ignore
201196
entity_0: _TScalar_0,
202197
entity_1: _TScalar_1,
203198
entity_2: Type[_TModel_2],
204-
**kw: Any,
205199
) -> Select[Tuple[_TScalar_0, _TScalar_1, _TModel_2]]:
206200
...
207201

@@ -211,7 +205,6 @@ def select( # type: ignore
211205
entity_0: _TScalar_0,
212206
entity_1: Type[_TModel_1],
213207
entity_2: _TScalar_2,
214-
**kw: Any,
215208
) -> Select[Tuple[_TScalar_0, _TModel_1, _TScalar_2]]:
216209
...
217210

@@ -221,7 +214,6 @@ def select( # type: ignore
221214
entity_0: _TScalar_0,
222215
entity_1: Type[_TModel_1],
223216
entity_2: Type[_TModel_2],
224-
**kw: Any,
225217
) -> Select[Tuple[_TScalar_0, _TModel_1, _TModel_2]]:
226218
...
227219

@@ -231,7 +223,6 @@ def select( # type: ignore
231223
entity_0: Type[_TModel_0],
232224
entity_1: _TScalar_1,
233225
entity_2: _TScalar_2,
234-
**kw: Any,
235226
) -> Select[Tuple[_TModel_0, _TScalar_1, _TScalar_2]]:
236227
...
237228

@@ -241,7 +232,6 @@ def select( # type: ignore
241232
entity_0: Type[_TModel_0],
242233
entity_1: _TScalar_1,
243234
entity_2: Type[_TModel_2],
244-
**kw: Any,
245235
) -> Select[Tuple[_TModel_0, _TScalar_1, _TModel_2]]:
246236
...
247237

@@ -251,7 +241,6 @@ def select( # type: ignore
251241
entity_0: Type[_TModel_0],
252242
entity_1: Type[_TModel_1],
253243
entity_2: _TScalar_2,
254-
**kw: Any,
255244
) -> Select[Tuple[_TModel_0, _TModel_1, _TScalar_2]]:
256245
...
257246

@@ -261,7 +250,6 @@ def select( # type: ignore
261250
entity_0: Type[_TModel_0],
262251
entity_1: Type[_TModel_1],
263252
entity_2: Type[_TModel_2],
264-
**kw: Any,
265253
) -> Select[Tuple[_TModel_0, _TModel_1, _TModel_2]]:
266254
...
267255

@@ -272,7 +260,6 @@ def select( # type: ignore
272260
entity_1: _TScalar_1,
273261
entity_2: _TScalar_2,
274262
entity_3: _TScalar_3,
275-
**kw: Any,
276263
) -> Select[Tuple[_TScalar_0, _TScalar_1, _TScalar_2, _TScalar_3]]:
277264
...
278265

@@ -283,7 +270,6 @@ def select( # type: ignore
283270
entity_1: _TScalar_1,
284271
entity_2: _TScalar_2,
285272
entity_3: Type[_TModel_3],
286-
**kw: Any,
287273
) -> Select[Tuple[_TScalar_0, _TScalar_1, _TScalar_2, _TModel_3]]:
288274
...
289275

@@ -294,7 +280,6 @@ def select( # type: ignore
294280
entity_1: _TScalar_1,
295281
entity_2: Type[_TModel_2],
296282
entity_3: _TScalar_3,
297-
**kw: Any,
298283
) -> Select[Tuple[_TScalar_0, _TScalar_1, _TModel_2, _TScalar_3]]:
299284
...
300285

@@ -305,7 +290,6 @@ def select( # type: ignore
305290
entity_1: _TScalar_1,
306291
entity_2: Type[_TModel_2],
307292
entity_3: Type[_TModel_3],
308-
**kw: Any,
309293
) -> Select[Tuple[_TScalar_0, _TScalar_1, _TModel_2, _TModel_3]]:
310294
...
311295

@@ -316,7 +300,6 @@ def select( # type: ignore
316300
entity_1: Type[_TModel_1],
317301
entity_2: _TScalar_2,
318302
entity_3: _TScalar_3,
319-
**kw: Any,
320303
) -> Select[Tuple[_TScalar_0, _TModel_1, _TScalar_2, _TScalar_3]]:
321304
...
322305

@@ -327,7 +310,6 @@ def select( # type: ignore
327310
entity_1: Type[_TModel_1],
328311
entity_2: _TScalar_2,
329312
entity_3: Type[_TModel_3],
330-
**kw: Any,
331313
) -> Select[Tuple[_TScalar_0, _TModel_1, _TScalar_2, _TModel_3]]:
332314
...
333315

@@ -338,7 +320,6 @@ def select( # type: ignore
338320
entity_1: Type[_TModel_1],
339321
entity_2: Type[_TModel_2],
340322
entity_3: _TScalar_3,
341-
**kw: Any,
342323
) -> Select[Tuple[_TScalar_0, _TModel_1, _TModel_2, _TScalar_3]]:
343324
...
344325

@@ -349,7 +330,6 @@ def select( # type: ignore
349330
entity_1: Type[_TModel_1],
350331
entity_2: Type[_TModel_2],
351332
entity_3: Type[_TModel_3],
352-
**kw: Any,
353333
) -> Select[Tuple[_TScalar_0, _TModel_1, _TModel_2, _TModel_3]]:
354334
...
355335

@@ -360,7 +340,6 @@ def select( # type: ignore
360340
entity_1: _TScalar_1,
361341
entity_2: _TScalar_2,
362342
entity_3: _TScalar_3,
363-
**kw: Any,
364343
) -> Select[Tuple[_TModel_0, _TScalar_1, _TScalar_2, _TScalar_3]]:
365344
...
366345

@@ -371,7 +350,6 @@ def select( # type: ignore
371350
entity_1: _TScalar_1,
372351
entity_2: _TScalar_2,
373352
entity_3: Type[_TModel_3],
374-
**kw: Any,
375353
) -> Select[Tuple[_TModel_0, _TScalar_1, _TScalar_2, _TModel_3]]:
376354
...
377355

@@ -382,7 +360,6 @@ def select( # type: ignore
382360
entity_1: _TScalar_1,
383361
entity_2: Type[_TModel_2],
384362
entity_3: _TScalar_3,
385-
**kw: Any,
386363
) -> Select[Tuple[_TModel_0, _TScalar_1, _TModel_2, _TScalar_3]]:
387364
...
388365

@@ -393,7 +370,6 @@ def select( # type: ignore
393370
entity_1: _TScalar_1,
394371
entity_2: Type[_TModel_2],
395372
entity_3: Type[_TModel_3],
396-
**kw: Any,
397373
) -> Select[Tuple[_TModel_0, _TScalar_1, _TModel_2, _TModel_3]]:
398374
...
399375

@@ -404,7 +380,6 @@ def select( # type: ignore
404380
entity_1: Type[_TModel_1],
405381
entity_2: _TScalar_2,
406382
entity_3: _TScalar_3,
407-
**kw: Any,
408383
) -> Select[Tuple[_TModel_0, _TModel_1, _TScalar_2, _TScalar_3]]:
409384
...
410385

@@ -415,7 +390,6 @@ def select( # type: ignore
415390
entity_1: Type[_TModel_1],
416391
entity_2: _TScalar_2,
417392
entity_3: Type[_TModel_3],
418-
**kw: Any,
419393
) -> Select[Tuple[_TModel_0, _TModel_1, _TScalar_2, _TModel_3]]:
420394
...
421395

@@ -426,7 +400,6 @@ def select( # type: ignore
426400
entity_1: Type[_TModel_1],
427401
entity_2: Type[_TModel_2],
428402
entity_3: _TScalar_3,
429-
**kw: Any,
430403
) -> Select[Tuple[_TModel_0, _TModel_1, _TModel_2, _TScalar_3]]:
431404
...
432405

@@ -437,18 +410,17 @@ def select( # type: ignore
437410
entity_1: Type[_TModel_1],
438411
entity_2: Type[_TModel_2],
439412
entity_3: Type[_TModel_3],
440-
**kw: Any,
441413
) -> Select[Tuple[_TModel_0, _TModel_1, _TModel_2, _TModel_3]]:
442414
...
443415

444416

445417
# Generated overloads end
446418

447419

448-
def select(*entities: Any, **kw: Any) -> Union[Select, SelectOfScalar]: # type: ignore
420+
def select(*entities: Any) -> Union[Select, SelectOfScalar]: # type: ignore
449421
if len(entities) == 1:
450-
return SelectOfScalar._create(*entities, **kw) # type: ignore
451-
return Select._create(*entities, **kw) # type: ignore
422+
return SelectOfScalar(*entities) # type: ignore
423+
return Select(*entities) # type: ignore
452424

453425

454426
# TODO: add several @overload from Python types to SQLAlchemy equivalents

0 commit comments

Comments
 (0)