- Fork elmeg-demo codebase for multi-band support - Add data importer infrastructure with base class - Create band-specific importers: - phish.py: Phish.net API v5 - grateful_dead.py: Grateful Stats API - setlistfm.py: Dead & Company, Billy Strings (Setlist.fm) - Add spec-kit configuration for Gemini - Update README with supported bands and architecture
159 lines
5.3 KiB
Python
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()
|