Coverage for tests / test_asyncio.py: 100%

44 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-11-09 00:02 +0000

1import asyncio 1jklmnopqr

2from collections.abc import Mapping 1jklmnopqr

3from typing import Any 1jklmnopqr

4 

5import pytest 1jklmnopqr

6from sqlalchemy import update 1jklmnopqr

7from sqlalchemy.engine import CursorResult, ScalarResult 1jklmnopqr

8from sqlalchemy.ext.asyncio import create_async_engine 1jklmnopqr

9from sqlmodel import Field, SQLModel, col, select 1jklmnopqr

10from sqlmodel.ext.asyncio.session import AsyncSession 1jklmnopqr

11from typing_extensions import Unpack, assert_type 1jklmnopqr

12 

13 

14@pytest.mark.parametrize("execution_options", [{}, {"populate_existing": True}]) 1jklmnopqr

15def test_async_session(execution_options: Mapping[str, Any]) -> None: 1jklmnopqr

16 class Hero(SQLModel, table=True): 1abcdefghi

17 id: int | None = Field(default=None, primary_key=True) 1abcdefghi

18 name: str 1abcdefghi

19 

20 async def run() -> None: 1abcdefghi

21 engine = create_async_engine("sqlite+aiosqlite://") 1abcdefghi

22 try: 1abcdefghi

23 async with engine.begin() as connection: 1abcdefghi

24 await connection.run_sync(SQLModel.metadata.create_all) 1abcdefghi

25 async with AsyncSession(engine) as session: 1abcdefghi

26 session.add(Hero(name="Deadpond")) 1abcdefghi

27 await session.commit() 1abcdefghi

28 

29 statement = select(Hero) 1abcdefghi

30 result = await session.exec( 1abcdefghi

31 statement, execution_options=execution_options 

32 ) 

33 assert_type(result, ScalarResult[Hero]) 1abcdefghi

34 assert result.one().name == "Deadpond" 1abcdefghi

35 

36 with pytest.warns(DeprecationWarning, match="session.exec"): 1abcdefghi

37 scalars = await session.scalars(statement) 1abcdefghi

38 assert_type(scalars, ScalarResult[Hero]) 1abcdefghi

39 assert scalars.one().name == "Deadpond" 1abcdefghi

40 

41 row = (await session.exec(select(col(Hero.id), Hero.name))).one() 1abcdefghi

42 assert_type(row, tuple[int | None, str]) 1abcdefghi

43 assert row == (1, "Deadpond") 1abcdefghi

44 

45 updated = await session.exec(update(Hero).values(name="Rusty-Man")) 1abcdefghi

46 assert_type(updated, CursorResult[Unpack[tuple[Any, ...]]]) 1abcdefghi

47 assert updated.rowcount == 1 1abcdefghi

48 await session.commit() 1abcdefghi

49 assert (await session.exec(select(Hero.name))).one() == "Rusty-Man" 1abcdefghi

50 

51 with pytest.warns(DeprecationWarning, match="session.exec"): 1abcdefghi

52 result = await session.execute(select(Hero)) # ty: ignore[deprecated] 1abcdefghi

53 assert result.scalars().one().name == "Rusty-Man" 1abcdefghi

54 finally: 

55 await engine.dispose() 1abcdefghi

56 

57 asyncio.run(run()) 1abcdefghi