from pydantic import BaseModel from typing import List class Person(BaseModel): id: int name: str async def create(conn): await conn.execute(''' CREATE TABLE IF NOT EXISTS Person ( id INTEGER PRIMARY KEY, name TEXT UNIQUE );''') async def search_by_name(conn, name: str) -> List[Person]: async with conn.execute(''' SELECT id, name FROM Person WHERE name LIKE ? ''', (f'%{name}%',)) as cursor: async for row in cursor: yield Person(id=row[0], name=row[1]) async def get_by_name(conn, name: str) -> Person: cursor = await conn.execute(''' SELECT id, name FROM Person WHERE name = ? ''', (name,)) row = await cursor.fetchone() if not row: return None return Person(id=row[0], name=row[1]) async def get_by_id(conn, id: int) -> Person: cursor = await conn.execute(''' SELECT id, name FROM Person WHERE id = ? ''', (id,)) row = await cursor.fetchone() if not row: return None return Person(id=row[0], name=row[1]) async def get_all(conn) -> List[Person]: async with conn.execute(''' SELECT id, name FROM Person ''') as cursor: async for row in cursor: yield Person(id=row[0], name=row[1]) async def insert_person(conn, person: Person) -> Person: cursor = await conn.execute(''' INSERT INTO Person (name) VALUES (?) ''', (person.name,)) person.id = cursor.lastrowid return person