What problem does it solve? Mixing synchronous SQLite calls with asyncio causes subtle bugs: cursors are not thread-safe, async functions passed to asyncio.to_thread() return coroutines instead of results, and rollbacks executed outside the worker thread leave transactions in a broken state. This Skill codifies the correct patterns so these errors never reach production. ## Core Features & Use Cases - Thread-Safe Query Patterns: Consolidate execute() and fetch*() calls into a single asyncio.to_thread() invocation so cursors never cross thread boundaries. - Transaction Safety: Handle commit and rollback inside the same named function that runs in the worker thread, preventing partial transaction states. - Connection Configuration: Enforce check_same_thread=False on connections shared across threads, including pool-managed connections. - Use Case: When refactoring a FastAPI endpoint from sync to async database access, apply these rules to avoid "coroutine object has no attribute 'fetchone'" errors and "database is locked" failures. ## Quick Start Review my FastAPI database code and fix any unsafe SQLite asyncio patterns using the python-async-sqlite rules.