anderson-ufrj
commited on
Commit
·
4e91d62
1
Parent(s):
c843087
fix(database): implement lazy initialization for database engine
Browse filesChange database engine creation from module-level to lazy initialization.
Prevents import-time connection attempts that fail on HuggingFace Spaces
where psycopg2 is not available but SQLAlchemy tries to initialize engine.
The engine and session factory are now created only when first accessed,
allowing the module to be imported without triggering database connections.
- src/db/simple_session.py +30 -15
src/db/simple_session.py
CHANGED
|
@@ -4,9 +4,9 @@ Simple database session management for SQLite.
|
|
| 4 |
|
| 5 |
import os
|
| 6 |
from contextlib import asynccontextmanager
|
| 7 |
-
from typing import AsyncGenerator
|
| 8 |
|
| 9 |
-
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
|
| 10 |
from dotenv import load_dotenv
|
| 11 |
|
| 12 |
load_dotenv()
|
|
@@ -14,25 +14,40 @@ load_dotenv()
|
|
| 14 |
# Get DATABASE_URL from environment
|
| 15 |
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite+aiosqlite:///./cidadao_ai.db")
|
| 16 |
|
| 17 |
-
#
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
echo=False,
|
| 21 |
-
pool_pre_ping=True,
|
| 22 |
-
)
|
| 23 |
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
engine
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
|
| 31 |
|
| 32 |
@asynccontextmanager
|
| 33 |
async def get_db_session() -> AsyncGenerator[AsyncSession, None]:
|
| 34 |
"""Get database session context manager."""
|
| 35 |
-
|
|
|
|
| 36 |
try:
|
| 37 |
yield session
|
| 38 |
await session.commit()
|
|
|
|
| 4 |
|
| 5 |
import os
|
| 6 |
from contextlib import asynccontextmanager
|
| 7 |
+
from typing import AsyncGenerator, Optional
|
| 8 |
|
| 9 |
+
from sqlalchemy.ext.asyncio import AsyncSession, AsyncEngine, create_async_engine, async_sessionmaker
|
| 10 |
from dotenv import load_dotenv
|
| 11 |
|
| 12 |
load_dotenv()
|
|
|
|
| 14 |
# Get DATABASE_URL from environment
|
| 15 |
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite+aiosqlite:///./cidadao_ai.db")
|
| 16 |
|
| 17 |
+
# Lazy initialization
|
| 18 |
+
_engine: Optional[AsyncEngine] = None
|
| 19 |
+
_session_factory: Optional[async_sessionmaker] = None
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
+
|
| 22 |
+
def _get_engine() -> AsyncEngine:
|
| 23 |
+
"""Get or create the async engine (lazy initialization)."""
|
| 24 |
+
global _engine
|
| 25 |
+
if _engine is None:
|
| 26 |
+
_engine = create_async_engine(
|
| 27 |
+
DATABASE_URL,
|
| 28 |
+
echo=False,
|
| 29 |
+
pool_pre_ping=True,
|
| 30 |
+
)
|
| 31 |
+
return _engine
|
| 32 |
+
|
| 33 |
+
|
| 34 |
+
def _get_session_factory() -> async_sessionmaker:
|
| 35 |
+
"""Get or create the session factory (lazy initialization)."""
|
| 36 |
+
global _session_factory
|
| 37 |
+
if _session_factory is None:
|
| 38 |
+
_session_factory = async_sessionmaker(
|
| 39 |
+
_get_engine(),
|
| 40 |
+
class_=AsyncSession,
|
| 41 |
+
expire_on_commit=False,
|
| 42 |
+
)
|
| 43 |
+
return _session_factory
|
| 44 |
|
| 45 |
|
| 46 |
@asynccontextmanager
|
| 47 |
async def get_db_session() -> AsyncGenerator[AsyncSession, None]:
|
| 48 |
"""Get database session context manager."""
|
| 49 |
+
factory = _get_session_factory()
|
| 50 |
+
async with factory() as session:
|
| 51 |
try:
|
| 52 |
yield session
|
| 53 |
await session.commit()
|