Browse hub, series rename, full-prediction dropdown + a DRY pass (7 sweeps) #90
@@ -15,16 +15,13 @@ sync/async boundary; the importer one stays as the lone sync consumer.
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Awaitable, Callable
|
from collections.abc import Awaitable, Callable
|
||||||
from typing import TypeVar
|
|
||||||
|
|
||||||
from sqlalchemy import Select
|
from sqlalchemy import Select
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
T = TypeVar("T")
|
|
||||||
|
|
||||||
|
async def get_or_create[T](
|
||||||
async def get_or_create(
|
|
||||||
session: AsyncSession,
|
session: AsyncSession,
|
||||||
select_stmt: Select,
|
select_stmt: Select,
|
||||||
factory: Callable[[], Awaitable[T]],
|
factory: Callable[[], Awaitable[T]],
|
||||||
|
|||||||
Reference in New Issue
Block a user