Spaces:
Paused
Paused
Upload core/database.py with huggingface_hub
Browse files- core/database.py +21 -15
core/database.py
CHANGED
|
@@ -16,39 +16,34 @@ from sqlalchemy.engine import Engine
|
|
| 16 |
from sqlalchemy.pool import QueuePool
|
| 17 |
|
| 18 |
from core.logging import logger
|
| 19 |
-
from core.models import (
|
| 20 |
AccessReview,
|
| 21 |
AuditLog,
|
| 22 |
-
# Database utilities
|
| 23 |
Base,
|
| 24 |
Case,
|
| 25 |
CaseActivity,
|
| 26 |
-
# Other models needed by routers
|
| 27 |
CaseNote,
|
| 28 |
CaseStatus,
|
| 29 |
CaseType,
|
| 30 |
ComplianceAuditLog,
|
| 31 |
-
RegulatoryReport,
|
| 32 |
-
SecurityIncident,
|
| 33 |
-
# Entity models
|
| 34 |
Entity,
|
| 35 |
Evidence,
|
| 36 |
-
# Compliance models
|
| 37 |
FraudAlert,
|
| 38 |
GraphSnapshot,
|
| 39 |
IdentityNode,
|
| 40 |
Project,
|
| 41 |
ReconciliationType,
|
|
|
|
| 42 |
Relationship,
|
| 43 |
RookieChecklist,
|
|
|
|
| 44 |
SessionLocal,
|
| 45 |
Team,
|
|
|
|
| 46 |
Transaction,
|
| 47 |
-
# User models
|
| 48 |
User,
|
| 49 |
-
TrainingRecord,
|
| 50 |
-
UserOnboardingState,
|
| 51 |
UserDevice,
|
|
|
|
| 52 |
UserRole,
|
| 53 |
create_engine_and_session,
|
| 54 |
create_tables,
|
|
@@ -123,17 +118,25 @@ class DatabaseOptimizer:
|
|
| 123 |
|
| 124 |
@event.listens_for(self.engine, "after_execute")
|
| 125 |
def after_execute(conn, clauseelement, multiparams, params, result):
|
| 126 |
-
execution_time = time.time() - conn.info.get(
|
|
|
|
|
|
|
| 127 |
query_stats["query_count"] += 1
|
| 128 |
query_stats["total_execution_time"] += execution_time
|
| 129 |
-
query_stats["avg_query_time"] =
|
|
|
|
|
|
|
| 130 |
|
| 131 |
# Log slow queries (>100ms)
|
| 132 |
if execution_time > 0.1:
|
| 133 |
query_str = str(clauseelement)
|
| 134 |
query_stats["slow_queries"].append(
|
| 135 |
{
|
| 136 |
-
"query": (
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
"execution_time": execution_time,
|
| 138 |
"timestamp": time.time(),
|
| 139 |
}
|
|
@@ -221,7 +224,9 @@ def optimize_database_performance():
|
|
| 221 |
try:
|
| 222 |
conn.execute(text("ANALYZE;")) # Update table statistics
|
| 223 |
conn.commit()
|
| 224 |
-
optimization_results["performance_improvements"]["statistics_updated"] =
|
|
|
|
|
|
|
| 225 |
except Exception as e:
|
| 226 |
logger.warning(f"Failed to update statistics: {e}")
|
| 227 |
|
|
@@ -345,7 +350,8 @@ def after_execute(conn, clauseelement, multiparams, params, result):
|
|
| 345 |
# Log slow queries
|
| 346 |
if duration > 2.0:
|
| 347 |
logger.warning(
|
| 348 |
-
f"Slow database query: {duration:.3f}s",
|
|
|
|
| 349 |
)
|
| 350 |
elif duration > 1.0:
|
| 351 |
logger.info(f"Database query completed in {duration:.3f}s")
|
|
|
|
| 16 |
from sqlalchemy.pool import QueuePool
|
| 17 |
|
| 18 |
from core.logging import logger
|
| 19 |
+
from core.models import ( # Database utilities; Other models needed by routers; Entity models; Compliance models; User models
|
| 20 |
AccessReview,
|
| 21 |
AuditLog,
|
|
|
|
| 22 |
Base,
|
| 23 |
Case,
|
| 24 |
CaseActivity,
|
|
|
|
| 25 |
CaseNote,
|
| 26 |
CaseStatus,
|
| 27 |
CaseType,
|
| 28 |
ComplianceAuditLog,
|
|
|
|
|
|
|
|
|
|
| 29 |
Entity,
|
| 30 |
Evidence,
|
|
|
|
| 31 |
FraudAlert,
|
| 32 |
GraphSnapshot,
|
| 33 |
IdentityNode,
|
| 34 |
Project,
|
| 35 |
ReconciliationType,
|
| 36 |
+
RegulatoryReport,
|
| 37 |
Relationship,
|
| 38 |
RookieChecklist,
|
| 39 |
+
SecurityIncident,
|
| 40 |
SessionLocal,
|
| 41 |
Team,
|
| 42 |
+
TrainingRecord,
|
| 43 |
Transaction,
|
|
|
|
| 44 |
User,
|
|
|
|
|
|
|
| 45 |
UserDevice,
|
| 46 |
+
UserOnboardingState,
|
| 47 |
UserRole,
|
| 48 |
create_engine_and_session,
|
| 49 |
create_tables,
|
|
|
|
| 118 |
|
| 119 |
@event.listens_for(self.engine, "after_execute")
|
| 120 |
def after_execute(conn, clauseelement, multiparams, params, result):
|
| 121 |
+
execution_time = time.time() - conn.info.get(
|
| 122 |
+
"query_start_time", time.time()
|
| 123 |
+
)
|
| 124 |
query_stats["query_count"] += 1
|
| 125 |
query_stats["total_execution_time"] += execution_time
|
| 126 |
+
query_stats["avg_query_time"] = (
|
| 127 |
+
query_stats["total_execution_time"] / query_stats["query_count"]
|
| 128 |
+
)
|
| 129 |
|
| 130 |
# Log slow queries (>100ms)
|
| 131 |
if execution_time > 0.1:
|
| 132 |
query_str = str(clauseelement)
|
| 133 |
query_stats["slow_queries"].append(
|
| 134 |
{
|
| 135 |
+
"query": (
|
| 136 |
+
query_str[:200] + "..."
|
| 137 |
+
if len(query_str) > 200
|
| 138 |
+
else query_str
|
| 139 |
+
),
|
| 140 |
"execution_time": execution_time,
|
| 141 |
"timestamp": time.time(),
|
| 142 |
}
|
|
|
|
| 224 |
try:
|
| 225 |
conn.execute(text("ANALYZE;")) # Update table statistics
|
| 226 |
conn.commit()
|
| 227 |
+
optimization_results["performance_improvements"]["statistics_updated"] = (
|
| 228 |
+
True
|
| 229 |
+
)
|
| 230 |
except Exception as e:
|
| 231 |
logger.warning(f"Failed to update statistics: {e}")
|
| 232 |
|
|
|
|
| 350 |
# Log slow queries
|
| 351 |
if duration > 2.0:
|
| 352 |
logger.warning(
|
| 353 |
+
f"Slow database query: {duration:.3f}s",
|
| 354 |
+
extra={"query_duration": duration, "query_type": "database"},
|
| 355 |
)
|
| 356 |
elif duration > 1.0:
|
| 357 |
logger.info(f"Database query completed in {duration:.3f}s")
|