150 lines
5.3 KiB
Python
150 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Database migration script to create comprehensive user data cache table.
|
|
Run this script to add the cache table to your database.
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from sqlalchemy import create_engine, text
|
|
from sqlalchemy.orm import sessionmaker
|
|
from loguru import logger
|
|
import argparse
|
|
from services.database import get_user_db_path
|
|
|
|
def create_cache_table(user_id=None):
|
|
"""Create the comprehensive user data cache table."""
|
|
try:
|
|
# Get database URL from environment or use default
|
|
if user_id:
|
|
db_path = get_user_db_path(user_id)
|
|
database_url = f'sqlite:///{db_path}'
|
|
logger.info(f"Targeting user database: {db_path}")
|
|
else:
|
|
logger.error("❌ Error: user_id is required to create cache table.")
|
|
return False
|
|
|
|
# Create engine
|
|
engine = create_engine(database_url)
|
|
|
|
# Create session
|
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
db = SessionLocal()
|
|
|
|
# SQL to create the cache table
|
|
create_table_sql = """
|
|
CREATE TABLE IF NOT EXISTS comprehensive_user_data_cache (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
strategy_id INTEGER,
|
|
data_hash VARCHAR(64) NOT NULL,
|
|
comprehensive_data JSON NOT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
expires_at DATETIME NOT NULL,
|
|
last_accessed DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
access_count INTEGER DEFAULT 0
|
|
);
|
|
"""
|
|
|
|
# Create indexes
|
|
create_indexes_sql = [
|
|
"CREATE INDEX IF NOT EXISTS idx_user_strategy ON comprehensive_user_data_cache(user_id, strategy_id);",
|
|
"CREATE INDEX IF NOT EXISTS idx_expires_at ON comprehensive_user_data_cache(expires_at);",
|
|
"CREATE INDEX IF NOT EXISTS idx_data_hash ON comprehensive_user_data_cache(data_hash);"
|
|
]
|
|
|
|
# Execute table creation
|
|
logger.info("Creating comprehensive_user_data_cache table...")
|
|
db.execute(text(create_table_sql))
|
|
|
|
# Execute index creation
|
|
logger.info("Creating indexes...")
|
|
for index_sql in create_indexes_sql:
|
|
db.execute(text(index_sql))
|
|
|
|
# Commit changes
|
|
db.commit()
|
|
|
|
# Verify table creation
|
|
result = db.execute(text("SELECT name FROM sqlite_master WHERE type='table' AND name='comprehensive_user_data_cache';"))
|
|
table_exists = result.fetchone()
|
|
|
|
if table_exists:
|
|
logger.info("✅ Comprehensive user data cache table created successfully!")
|
|
|
|
# Show table structure
|
|
result = db.execute(text("PRAGMA table_info(comprehensive_user_data_cache);"))
|
|
columns = result.fetchall()
|
|
|
|
logger.info("Table structure:")
|
|
for column in columns:
|
|
logger.info(f" - {column[1]} ({column[2]})")
|
|
|
|
else:
|
|
logger.error("❌ Failed to create comprehensive_user_data_cache table")
|
|
return False
|
|
|
|
db.close()
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"❌ Error creating cache table: {str(e)}")
|
|
if 'db' in locals():
|
|
db.close()
|
|
return False
|
|
|
|
def drop_cache_table(user_id=None):
|
|
"""Drop the comprehensive user data cache table (for testing)."""
|
|
try:
|
|
# Get database URL from environment or use default
|
|
if user_id:
|
|
db_path = get_user_db_path(user_id)
|
|
database_url = f'sqlite:///{db_path}'
|
|
logger.info(f"Targeting user database: {db_path}")
|
|
else:
|
|
logger.error("❌ Error: user_id is required to drop cache table.")
|
|
return False
|
|
|
|
# Create engine
|
|
engine = create_engine(database_url)
|
|
|
|
# Create session
|
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
db = SessionLocal()
|
|
|
|
logger.info("Dropping comprehensive_user_data_cache table...")
|
|
db.execute(text("DROP TABLE IF EXISTS comprehensive_user_data_cache"))
|
|
db.commit()
|
|
logger.info("✅ Table dropped successfully")
|
|
|
|
db.close()
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"❌ Error dropping cache table: {str(e)}")
|
|
if 'db' in locals():
|
|
db.close()
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(description="Create comprehensive user data cache table")
|
|
parser.add_argument("--user_id", help="Target specific user ID")
|
|
parser.add_argument("--drop", action="store_true", help="Drop the table instead of creating it")
|
|
args = parser.parse_args()
|
|
|
|
if args.drop:
|
|
logger.info("🗑️ Dropping comprehensive user data cache table...")
|
|
success = drop_cache_table(args.user_id)
|
|
else:
|
|
logger.info("🚀 Creating comprehensive user data cache table...")
|
|
success = create_cache_table(args.user_id)
|
|
|
|
if success:
|
|
logger.success("🎉 Operation completed successfully!")
|
|
sys.exit(0)
|
|
else:
|
|
logger.error("❌ Operation failed!")
|
|
sys.exit(1)
|