Skip to content

Commit 50c349f

Browse files
Merge pull request #537 from MervinPraison/claude/issue-335-20250529_033521
fix: Add FORCE_SQLITE environment variable to bypass production database detection
2 parents faf2f40 + 40c90cd commit 50c349f

4 files changed

Lines changed: 106 additions & 9 deletions

File tree

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"""
2+
Database configuration utilities for PraisonAI UI components.
3+
4+
This module provides centralized database configuration functionality,
5+
particularly for handling the FORCE_SQLITE environment variable.
6+
"""
7+
8+
import os
9+
from typing import Optional, Tuple
10+
11+
12+
def should_force_sqlite() -> bool:
13+
"""
14+
Check if FORCE_SQLITE environment variable is set to true.
15+
16+
Returns:
17+
bool: True if FORCE_SQLITE is set to "true" (case-insensitive), False otherwise.
18+
"""
19+
return os.getenv("FORCE_SQLITE", "false").lower() == "true"
20+
21+
22+
def get_database_url_with_sqlite_override() -> Optional[str]:
23+
"""
24+
Get database URL respecting FORCE_SQLITE flag.
25+
26+
When FORCE_SQLITE=true, this function returns None to force SQLite usage.
27+
Otherwise, it returns the appropriate database URL from environment variables.
28+
29+
Returns:
30+
Optional[str]: Database URL if external database should be used, None for SQLite.
31+
"""
32+
if should_force_sqlite():
33+
return None
34+
35+
database_url = os.getenv("DATABASE_URL")
36+
supabase_url = os.getenv("SUPABASE_DATABASE_URL")
37+
return supabase_url if supabase_url else database_url
38+
39+
40+
def get_database_config_for_sqlalchemy() -> Tuple[Optional[str], Optional[str]]:
41+
"""
42+
Get database configuration for SQLAlchemy module respecting FORCE_SQLITE flag.
43+
44+
Returns:
45+
Tuple[Optional[str], Optional[str]]: (DATABASE_URL, SUPABASE_DATABASE_URL)
46+
Both will be None if FORCE_SQLITE=true, otherwise original values.
47+
"""
48+
if should_force_sqlite():
49+
return None, None
50+
else:
51+
database_url = os.getenv("DATABASE_URL")
52+
supabase_url = os.getenv("SUPABASE_DATABASE_URL")
53+
# Apply Supabase override logic
54+
if supabase_url:
55+
database_url = supabase_url
56+
return database_url, supabase_url

src/praisonai/praisonai/ui/db.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from sql_alchemy import SQLAlchemyDataLayer
1010
import chainlit.data as cl_data
1111
from chainlit.types import ThreadDict
12+
from database_config import get_database_url_with_sqlite_override
1213

1314
def ensure_directories():
1415
"""Ensure required directories exist"""
@@ -57,10 +58,8 @@ def ensure_directories():
5758

5859
class DatabaseManager(SQLAlchemyDataLayer):
5960
def __init__(self):
60-
self.database_url = os.getenv("DATABASE_URL")
61-
supabase_url = os.getenv("SUPABASE_DATABASE_URL")
62-
if supabase_url:
63-
self.database_url = supabase_url
61+
# Check FORCE_SQLITE flag to bypass external database detection
62+
self.database_url = get_database_url_with_sqlite_override()
6463

6564
if self.database_url:
6665
self.conninfo = self.database_url

src/praisonai/praisonai/ui/sql_alchemy.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,14 @@
2929
from sqlalchemy.exc import SQLAlchemyError
3030
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, create_async_engine
3131
from sqlalchemy.orm import sessionmaker
32+
from database_config import get_database_config_for_sqlalchemy
3233

3334
if TYPE_CHECKING:
3435
from chainlit.element import Element
3536
from chainlit.step import StepDict
3637

37-
DATABASE_URL = os.getenv("DATABASE_URL")
38-
SUPABASE_DATABASE_URL = os.getenv("SUPABASE_DATABASE_URL")
39-
if SUPABASE_DATABASE_URL:
40-
# If a Supabase database URL is provided, use it.
41-
DATABASE_URL = SUPABASE_DATABASE_URL
38+
# Check FORCE_SQLITE flag to bypass external database detection
39+
DATABASE_URL, SUPABASE_DATABASE_URL = get_database_config_for_sqlalchemy()
4240

4341
class SQLAlchemyDataLayer(BaseDataLayer):
4442
def __init__(
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Test script for database_config module functionality.
4+
"""
5+
6+
import sys
7+
import os
8+
sys.path.insert(0, 'src/praisonai/praisonai/ui')
9+
10+
# Test the database_config module
11+
from database_config import should_force_sqlite, get_database_url_with_sqlite_override, get_database_config_for_sqlalchemy
12+
13+
def test_database_config():
14+
print("Testing database_config utilities...")
15+
16+
# Test 1: FORCE_SQLITE=false (default)
17+
print('\nTest 1: Default behavior (FORCE_SQLITE not set)')
18+
os.environ.pop('FORCE_SQLITE', None)
19+
os.environ.pop('DATABASE_URL', None)
20+
os.environ.pop('SUPABASE_DATABASE_URL', None)
21+
print(f'should_force_sqlite(): {should_force_sqlite()}')
22+
print(f'get_database_url_with_sqlite_override(): {get_database_url_with_sqlite_override()}')
23+
print(f'get_database_config_for_sqlalchemy(): {get_database_config_for_sqlalchemy()}')
24+
25+
# Test 2: FORCE_SQLITE=true
26+
print('\nTest 2: FORCE_SQLITE=true')
27+
os.environ['FORCE_SQLITE'] = 'true'
28+
os.environ['DATABASE_URL'] = 'postgres://test'
29+
os.environ['SUPABASE_DATABASE_URL'] = 'postgres://supabase'
30+
print(f'should_force_sqlite(): {should_force_sqlite()}')
31+
print(f'get_database_url_with_sqlite_override(): {get_database_url_with_sqlite_override()}')
32+
print(f'get_database_config_for_sqlalchemy(): {get_database_config_for_sqlalchemy()}')
33+
34+
# Test 3: FORCE_SQLITE=false with DATABASE_URL
35+
print('\nTest 3: FORCE_SQLITE=false with DATABASE_URL')
36+
os.environ['FORCE_SQLITE'] = 'false'
37+
print(f'should_force_sqlite(): {should_force_sqlite()}')
38+
print(f'get_database_url_with_sqlite_override(): {get_database_url_with_sqlite_override()}')
39+
print(f'get_database_config_for_sqlalchemy(): {get_database_config_for_sqlalchemy()}')
40+
41+
print('\n✅ All tests completed - utility functions work correctly!')
42+
43+
if __name__ == "__main__":
44+
test_database_config()

0 commit comments

Comments
 (0)