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
« 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
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
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
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
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
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
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
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
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
57 asyncio.run(run()) 1abcdefghi