Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
File size: 6,856 Bytes
5259aa6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
#!/usr/bin/env python3
"""
Database migration script for TTS Arena analytics columns.
Usage:
python migrate.py database.db
python migrate.py instance/tts_arena.db
"""
import click
import sqlite3
import sys
import os
from pathlib import Path
def check_column_exists(cursor, table_name, column_name):
"""Check if a column exists in a table."""
cursor.execute(f"PRAGMA table_info({table_name})")
columns = [row[1] for row in cursor.fetchall()]
return column_name in columns
def add_analytics_columns(db_path):
"""Add analytics columns to the vote table."""
if not os.path.exists(db_path):
click.echo(f"β Database file not found: {db_path}", err=True)
return False
try:
# Connect to the database
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Check if vote table exists
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='vote'")
if not cursor.fetchone():
click.echo("β Vote table not found in database", err=True)
return False
# Define the columns to add to vote table
vote_columns_to_add = [
("session_duration_seconds", "REAL"),
("ip_address_partial", "VARCHAR(20)"),
("user_agent", "VARCHAR(500)"),
("generation_date", "DATETIME"),
("cache_hit", "BOOLEAN")
]
# Define the columns to add to user table
user_columns_to_add = [
("hf_account_created", "DATETIME")
]
added_columns = []
skipped_columns = []
# Add vote table columns
click.echo("π Processing vote table columns...")
for column_name, column_type in vote_columns_to_add:
if check_column_exists(cursor, "vote", column_name):
skipped_columns.append(f"vote.{column_name}")
click.echo(f"βοΈ Column 'vote.{column_name}' already exists, skipping")
else:
try:
cursor.execute(f"ALTER TABLE vote ADD COLUMN {column_name} {column_type}")
added_columns.append(f"vote.{column_name}")
click.echo(f"β
Added column 'vote.{column_name}' ({column_type})")
except sqlite3.Error as e:
click.echo(f"β Failed to add column 'vote.{column_name}': {e}", err=True)
conn.rollback()
return False
# Add user table columns
click.echo("π€ Processing user table columns...")
for column_name, column_type in user_columns_to_add:
if check_column_exists(cursor, "user", column_name):
skipped_columns.append(f"user.{column_name}")
click.echo(f"βοΈ Column 'user.{column_name}' already exists, skipping")
else:
try:
cursor.execute(f"ALTER TABLE user ADD COLUMN {column_name} {column_type}")
added_columns.append(f"user.{column_name}")
click.echo(f"β
Added column 'user.{column_name}' ({column_type})")
except sqlite3.Error as e:
click.echo(f"β Failed to add column 'user.{column_name}': {e}", err=True)
conn.rollback()
return False
# Commit the changes
conn.commit()
conn.close()
# Summary
if added_columns:
click.echo(f"\nπ Successfully added {len(added_columns)} analytics columns:")
for col in added_columns:
click.echo(f" β’ {col}")
if skipped_columns:
click.echo(f"\nβοΈ Skipped {len(skipped_columns)} existing columns:")
for col in skipped_columns:
click.echo(f" β’ {col}")
if not added_columns and not skipped_columns:
click.echo("β No columns were processed")
return False
click.echo(f"\n⨠Migration completed successfully!")
return True
except sqlite3.Error as e:
click.echo(f"β Database error: {e}", err=True)
return False
except Exception as e:
click.echo(f"β Unexpected error: {e}", err=True)
return False
@click.command()
@click.argument('database_path', type=click.Path())
@click.option('--dry-run', is_flag=True, help='Show what would be done without making changes')
@click.option('--backup', is_flag=True, help='Create a backup before migration')
def migrate(database_path, dry_run, backup):
"""
Add analytics columns to the TTS Arena database.
DATABASE_PATH: Path to the SQLite database file (e.g., instance/tts_arena.db)
"""
click.echo("π TTS Arena Analytics Migration Tool")
click.echo("=" * 40)
# Resolve the database path
db_path = Path(database_path).resolve()
click.echo(f"π Database: {db_path}")
if not db_path.exists():
click.echo(f"β Database file not found: {db_path}", err=True)
sys.exit(1)
# Create backup if requested
if backup:
backup_path = db_path.with_suffix(f"{db_path.suffix}.backup")
try:
import shutil
shutil.copy2(db_path, backup_path)
click.echo(f"πΎ Backup created: {backup_path}")
except Exception as e:
click.echo(f"β Failed to create backup: {e}", err=True)
sys.exit(1)
if dry_run:
click.echo("\nπ DRY RUN MODE - No changes will be made")
click.echo("The following columns would be added to the 'vote' table:")
click.echo(" β’ session_duration_seconds (REAL)")
click.echo(" β’ ip_address_partial (VARCHAR(20))")
click.echo(" β’ user_agent (VARCHAR(500))")
click.echo(" β’ generation_date (DATETIME)")
click.echo(" β’ cache_hit (BOOLEAN)")
click.echo("\nThe following columns would be added to the 'user' table:")
click.echo(" β’ hf_account_created (DATETIME)")
click.echo("\nRun without --dry-run to apply changes.")
return
# Confirm before proceeding
if not click.confirm(f"\nβ οΈ This will modify the database at {db_path}. Continue?"):
click.echo("β Migration cancelled")
sys.exit(0)
# Perform the migration
click.echo("\nπ§ Starting migration...")
success = add_analytics_columns(str(db_path))
if success:
click.echo("\nπ Migration completed successfully!")
click.echo("You can now restart your TTS Arena application to use analytics features.")
else:
click.echo("\nπ₯ Migration failed!")
sys.exit(1)
if __name__ == "__main__":
migrate() |