seed_leagues_mongo.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. """Seed initial league data into a local MongoDB instance.
  2. Usage (PowerShell):
  3. python -m pip install "pymongo>=4.7"
  4. $env:DATABANK_DB_URI = "mongodb://localhost:27017"
  5. $env:DATABANK_DB_NAME = "databank"
  6. python scripts/seed_leagues_mongo.py
  7. """
  8. from __future__ import annotations
  9. import os
  10. from typing import Any, Dict, Iterable
  11. from pymongo import MongoClient
  12. def get_connection() -> tuple[MongoClient, str]:
  13. """Create a MongoDB client and return ``(client, db_name)``.
  14. Reads env vars with sensible defaults.
  15. """
  16. uri_default = "mongodb://localhost:27017"
  17. name_default = "databank"
  18. uri = os.getenv("DATABANK_DB_URI", uri_default)
  19. name = os.getenv("DATABANK_DB_NAME", name_default)
  20. client = MongoClient(uri)
  21. return client, name
  22. def ensure_unique_index_leagues(db) -> None:
  23. """Ensure a unique index on ``leagues.league_id``."""
  24. leagues = db["leagues"]
  25. leagues.create_index("league_id", unique=True)
  26. def upsert_leagues(db, docs: Iterable[Dict[str, Any]]) -> dict:
  27. """Upsert provided league docs by ``league_id``; return counters."""
  28. leagues = db["leagues"]
  29. inserted = 0
  30. updated = 0
  31. for doc in docs:
  32. key = {"league_id": doc["league_id"]}
  33. # Replace entire document on upsert to keep fields consistent
  34. result = leagues.replace_one(key, doc, upsert=True)
  35. if result.matched_count:
  36. updated += int(result.modified_count == 1)
  37. else:
  38. inserted += 1
  39. return {"inserted": inserted, "updated": updated}
  40. def main() -> None:
  41. """Entry point to seed initial league documents into MongoDB."""
  42. client, db_name = get_connection()
  43. try:
  44. db = client[db_name]
  45. ensure_unique_index_leagues(db)
  46. seed = [
  47. {"league_id": 2079, "league_name": "英超", "max_round": 38},
  48. {"league_id": 2080, "league_name": "英冠", "max_round": 46},
  49. {"league_id": 2081, "league_name": "英甲", "max_round": 46},
  50. {"league_id": 2082, "league_name": "英乙", "max_round": 46},
  51. ]
  52. stats = upsert_leagues(db, seed)
  53. print(f"Seed done: inserted={stats['inserted']}, updated={stats['updated']}")
  54. finally:
  55. client.close()
  56. if __name__ == "__main__":
  57. main()