build_analytics.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from datetime import UTC, date, datetime
  2. from sqlalchemy.dialects.mysql import insert
  3. from app.core.config import Settings
  4. from app.infrastructure.mysql.analytics_models import (
  5. AnalyticsSyncOffsetRecord,
  6. DimDateRecord,
  7. MetricDefinitionRecord,
  8. )
  9. from app.infrastructure.mysql.sessions import (
  10. DatabaseName,
  11. create_mysql_engine,
  12. create_session_factory,
  13. )
  14. def build_analytics_foundation(settings: Settings | None = None) -> None:
  15. resolved_settings = settings or Settings()
  16. engine = create_mysql_engine(resolved_settings, DatabaseName.ANALYTICS)
  17. factory = create_session_factory(engine)
  18. today = date.today()
  19. date_key = int(today.strftime("%Y%m%d"))
  20. with factory.begin() as session:
  21. session.execute(
  22. insert(DimDateRecord)
  23. .values(
  24. date_key=date_key,
  25. full_date=today,
  26. year=today.year,
  27. month=today.month,
  28. day=today.day,
  29. )
  30. .on_duplicate_key_update(full_date=today)
  31. )
  32. session.execute(
  33. insert(MetricDefinitionRecord)
  34. .values(
  35. metric_code="ORDER_COUNT",
  36. name="订单量",
  37. description="按筛选条件统计的订单数量",
  38. unit="笔",
  39. expression="COUNT(order_id)",
  40. )
  41. .on_duplicate_key_update(name="订单量")
  42. )
  43. session.execute(
  44. insert(AnalyticsSyncOffsetRecord)
  45. .values(source_name="core_outbox", updated_at=datetime.now(UTC))
  46. .on_duplicate_key_update(updated_at=datetime.now(UTC))
  47. )
  48. engine.dispose()
  49. if __name__ == "__main__":
  50. build_analytics_foundation()
  51. print("Analytics 基础维度、指标定义和同步游标已构建。")