elmeg-demo/backend/migrate_honking.py

159 lines
5.3 KiB
Python

"""
Migration script to import real Goose data from Honkingversion to Elmeg Demo
"""
import sqlite3
import sys
from datetime import datetime
from sqlmodel import Session, select
from database import engine
from models import Vertical, Venue, Tour, Show, Song, Performance
SOURCE_DB = "/Users/ten/ANTIGRAVITY/honkingversion/database.db"
def migrate_data():
print("=" * 60)
print("MIGRATING REAL GOOSE DATA")
print("=" * 60)
# Connect to source DB
try:
src_conn = sqlite3.connect(SOURCE_DB)
src_conn.row_factory = sqlite3.Row
src_cur = src_conn.cursor()
print(f"✓ Connected to source: {SOURCE_DB}")
except Exception as e:
print(f"❌ Failed to connect to source DB: {e}")
return
with Session(engine) as session:
# 1. Get or Create Goose Vertical
vertical = session.exec(select(Vertical).where(Vertical.slug == "goose")).first()
if not vertical:
vertical = Vertical(name="Goose", slug="goose", description="Jam band from CT")
session.add(vertical)
session.commit()
session.refresh(vertical)
print(f"✓ Created Goose vertical (ID: {vertical.id})")
else:
print(f"✓ Found Goose vertical (ID: {vertical.id})")
# 2. Clear existing data (except Users)
print("Clearing existing show data...")
session.exec("DELETE FROM performance")
session.exec("DELETE FROM show")
session.exec("DELETE FROM song")
session.exec("DELETE FROM tour")
session.exec("DELETE FROM venue")
session.commit()
print("✓ Cleared existing data")
# 3. Migrate Venues
print("Migrating Venues...")
src_cur.execute("SELECT * FROM venue")
venues = src_cur.fetchall()
venue_map = {} # old_id -> new_id
for v in venues:
new_venue = Venue(
name=v['name'],
city=v['city'],
state=v['state'],
country=v['country']
)
session.add(new_venue)
session.commit()
session.refresh(new_venue)
venue_map[v['id']] = new_venue.id
print(f"✓ Migrated {len(venues)} venues")
# 4. Migrate Tours
print("Migrating Tours...")
src_cur.execute("SELECT * FROM tour")
tours = src_cur.fetchall()
tour_map = {}
for t in tours:
# Handle date parsing if needed, assuming strings in sqlite
start_date = datetime.strptime(t['start_date'], '%Y-%m-%d %H:%M:%S') if t['start_date'] else None
end_date = datetime.strptime(t['end_date'], '%Y-%m-%d %H:%M:%S') if t['end_date'] else None
new_tour = Tour(
name=t['name'],
start_date=start_date,
end_date=end_date
)
session.add(new_tour)
session.commit()
session.refresh(new_tour)
tour_map[t['id']] = new_tour.id
print(f"✓ Migrated {len(tours)} tours")
# 5. Migrate Songs
print("Migrating Songs...")
src_cur.execute("SELECT * FROM song")
songs = src_cur.fetchall()
song_map = {}
for s in songs:
new_song = Song(
title=s['name'], # Map 'name' to 'title'
original_artist=s['original_artist'],
vertical_id=vertical.id
)
session.add(new_song)
session.commit()
session.refresh(new_song)
song_map[s['id']] = new_song.id
print(f"✓ Migrated {len(songs)} songs")
# 6. Migrate Shows
print("Migrating Shows...")
src_cur.execute("SELECT * FROM show")
shows = src_cur.fetchall()
show_map = {}
for s in shows:
show_date = datetime.strptime(s['date'], '%Y-%m-%d %H:%M:%S') if s['date'] else None
new_show = Show(
date=show_date,
vertical_id=vertical.id,
venue_id=venue_map.get(s['venue_id']),
tour_id=tour_map.get(s['tour_id']),
notes=s['notes']
)
session.add(new_show)
session.commit()
session.refresh(new_show)
show_map[s['id']] = new_show.id
print(f"✓ Migrated {len(shows)} shows")
# 7. Migrate Performances
print("Migrating Performances...")
src_cur.execute("SELECT * FROM songperformance")
perfs = src_cur.fetchall()
for p in perfs:
# Skip if show or song missing (data integrity)
if p['show_id'] not in show_map or p['song_id'] not in song_map:
continue
new_perf = Performance(
show_id=show_map[p['show_id']],
song_id=song_map[p['song_id']],
position=p['position'],
set_name=p['set_name'],
segue=bool(p['segue']),
notes=p['notes']
)
session.add(new_perf)
session.commit()
print(f"✓ Migrated {len(perfs)} performances")
src_conn.close()
print("=" * 60)
print("✓ MIGRATION COMPLETE")
print("=" * 60)
if __name__ == "__main__":
migrate_data()