- export_tld_prices.py: Export DB prices to JSON - import_tld_prices.py: Import prices from JSON - seed_tld_prices.py: Initial scrape from Porkbun API - tld_prices_export.json: Current price data (886 TLDs) Usage: python scripts/seed_tld_prices.py # Initial scrape python scripts/export_tld_prices.py # Backup to JSON python scripts/import_tld_prices.py # Restore from JSON
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Export TLD prices from database to JSON file for backup/versioning."""
|
|
import asyncio
|
|
import json
|
|
import sys
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
# Add parent directory to path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from sqlalchemy import select
|
|
from app.database import AsyncSessionLocal, init_db
|
|
from app.models.tld_price import TLDPrice
|
|
|
|
|
|
async def export_prices():
|
|
"""Export all TLD prices to JSON."""
|
|
await init_db()
|
|
|
|
async with AsyncSessionLocal() as db:
|
|
result = await db.execute(select(TLDPrice).order_by(TLDPrice.tld))
|
|
prices = result.scalars().all()
|
|
|
|
data = {
|
|
"exported_at": datetime.utcnow().isoformat(),
|
|
"total_records": len(prices),
|
|
"prices": [
|
|
{
|
|
"tld": p.tld,
|
|
"registrar": p.registrar,
|
|
"registration_price": p.registration_price,
|
|
"renewal_price": p.renewal_price,
|
|
"transfer_price": p.transfer_price,
|
|
"currency": p.currency,
|
|
"promo_price": p.promo_price,
|
|
"recorded_at": p.recorded_at.isoformat() if p.recorded_at else None,
|
|
}
|
|
for p in prices
|
|
]
|
|
}
|
|
|
|
# Save to file
|
|
output_path = Path(__file__).parent / "tld_prices_export.json"
|
|
with open(output_path, "w") as f:
|
|
json.dump(data, f, indent=2)
|
|
|
|
print(f"Exported {len(prices)} TLD prices to {output_path}")
|
|
return output_path
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(export_prices())
|
|
|