170 lines
4.7 KiB
Python
170 lines
4.7 KiB
Python
"""
|
||
更新太阳系行星和矮行星的轨道参数到 extra_data 字段
|
||
|
||
将硬编码在 celestial_orbit.py 中的轨道周期和颜色迁移到数据库的 extra_data 字段
|
||
这样用户可以在后台界面直接编辑这些参数
|
||
"""
|
||
import asyncio
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
# Add backend directory to path
|
||
backend_dir = Path(__file__).parent.parent
|
||
sys.path.insert(0, str(backend_dir))
|
||
|
||
from sqlalchemy import select, update
|
||
from app.database import AsyncSessionLocal
|
||
from app.models.db.celestial_body import CelestialBody
|
||
|
||
|
||
# 轨道参数(从 celestial_orbit.py 迁移)
|
||
ORBIT_PARAMS = {
|
||
# 行星 - 完整公转周期
|
||
"199": {
|
||
"orbit_period_days": 88.0,
|
||
"orbit_color": "#8C7853",
|
||
"name_zh": "水星"
|
||
},
|
||
"299": {
|
||
"orbit_period_days": 224.7,
|
||
"orbit_color": "#FFC649",
|
||
"name_zh": "金星"
|
||
},
|
||
"399": {
|
||
"orbit_period_days": 365.25,
|
||
"orbit_color": "#4A90E2",
|
||
"name_zh": "地球"
|
||
},
|
||
"499": {
|
||
"orbit_period_days": 687.0,
|
||
"orbit_color": "#CD5C5C",
|
||
"name_zh": "火星"
|
||
},
|
||
"599": {
|
||
"orbit_period_days": 4333.0,
|
||
"orbit_color": "#DAA520",
|
||
"name_zh": "木星"
|
||
},
|
||
"699": {
|
||
"orbit_period_days": 10759.0,
|
||
"orbit_color": "#F4A460",
|
||
"name_zh": "土星"
|
||
},
|
||
"799": {
|
||
"orbit_period_days": 30687.0,
|
||
"orbit_color": "#4FD1C5",
|
||
"name_zh": "天王星"
|
||
},
|
||
"899": {
|
||
"orbit_period_days": 60190.0,
|
||
"orbit_color": "#4169E1",
|
||
"name_zh": "海王星"
|
||
},
|
||
|
||
# 矮行星 - 完整公转周期
|
||
"999": {
|
||
"orbit_period_days": 90560.0,
|
||
"orbit_color": "#8B7355",
|
||
"name_zh": "冥王星"
|
||
},
|
||
"2000001": {
|
||
"orbit_period_days": 1680.0,
|
||
"orbit_color": "#9E9E9E",
|
||
"name_zh": "谷神星"
|
||
},
|
||
"136199": {
|
||
"orbit_period_days": 203500.0,
|
||
"orbit_color": "#E0E0E0",
|
||
"name_zh": "阋神星"
|
||
},
|
||
"136108": {
|
||
"orbit_period_days": 104000.0,
|
||
"orbit_color": "#D4A574",
|
||
"name_zh": "妊神星"
|
||
},
|
||
"136472": {
|
||
"orbit_period_days": 112897.0,
|
||
"orbit_color": "#C49A6C",
|
||
"name_zh": "鸟神星"
|
||
},
|
||
}
|
||
|
||
|
||
async def update_orbit_parameters():
|
||
"""更新数据库中的轨道参数"""
|
||
|
||
async with AsyncSessionLocal() as session:
|
||
print("🔄 开始更新轨道参数...\n")
|
||
|
||
updated_count = 0
|
||
not_found_count = 0
|
||
|
||
for body_id, params in ORBIT_PARAMS.items():
|
||
# 查询天体
|
||
result = await session.execute(
|
||
select(CelestialBody).where(CelestialBody.id == body_id)
|
||
)
|
||
body = result.scalar_one_or_none()
|
||
|
||
if not body:
|
||
print(f"⚠️ 天体 {body_id} ({params['name_zh']}) 未找到")
|
||
not_found_count += 1
|
||
continue
|
||
|
||
# 合并 extra_data
|
||
extra_data = body.extra_data or {}
|
||
extra_data["orbit_period_days"] = params["orbit_period_days"]
|
||
extra_data["orbit_color"] = params["orbit_color"]
|
||
|
||
# 更新数据库
|
||
await session.execute(
|
||
update(CelestialBody)
|
||
.where(CelestialBody.id == body_id)
|
||
.values(extra_data=extra_data)
|
||
)
|
||
|
||
print(f"✅ {params['name_zh']:8s} (ID: {body_id:7s}) - "
|
||
f"周期: {params['orbit_period_days']:8.1f} 天 ({params['orbit_period_days']/365.25:6.2f} 年), "
|
||
f"颜色: {params['orbit_color']}")
|
||
updated_count += 1
|
||
|
||
await session.commit()
|
||
|
||
print(f"\n{'='*80}")
|
||
print(f"✅ 更新完成: {updated_count} 个天体")
|
||
if not_found_count > 0:
|
||
print(f"⚠️ 未找到: {not_found_count} 个天体")
|
||
print(f"{'='*80}")
|
||
|
||
|
||
async def main():
|
||
"""主函数"""
|
||
print("=" * 80)
|
||
print("太阳系行星和矮行星轨道参数更新工具")
|
||
print("=" * 80)
|
||
print()
|
||
|
||
await update_orbit_parameters()
|
||
|
||
print("\n灶神星(Vesta)轨道参数:")
|
||
print("=" * 80)
|
||
print("JPL Horizons ID: 2000004")
|
||
print("英文名: Vesta")
|
||
print("中文名: 灶神星")
|
||
print("类型: 矮行星 (dwarf_planet)")
|
||
print()
|
||
print("轨道参数:")
|
||
print(" - 轨道周期: 1325.46 天 (约 3.63 年)")
|
||
print(" - 建议颜色: #A8A8A8 (浅灰色)")
|
||
print(" - 半长轴: 2.36 AU")
|
||
print(" - 离心率: 0.089")
|
||
print(" - 轨道倾角: 7.14°")
|
||
print()
|
||
print("描述: 灶神星是小行星带中第二大的小行星,直径约525公里。")
|
||
print(" 它是唯一一颗肉眼可见的小行星,也是黎明号探测器访问过的天体。")
|
||
print("=" * 80)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(main())
|