anderson-ufrj commited on
Commit
4e91d62
·
1 Parent(s): c843087

fix(database): implement lazy initialization for database engine

Browse files

Change 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.

Files changed (1) hide show
  1. 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
- # Create async engine
18
- engine = create_async_engine(
19
- DATABASE_URL,
20
- echo=False,
21
- pool_pre_ping=True,
22
- )
23
 
24
- # Create session factory
25
- AsyncSessionLocal = async_sessionmaker(
26
- engine,
27
- class_=AsyncSession,
28
- expire_on_commit=False,
29
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
 
32
  @asynccontextmanager
33
  async def get_db_session() -> AsyncGenerator[AsyncSession, None]:
34
  """Get database session context manager."""
35
- async with AsyncSessionLocal() as session:
 
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()