Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 26 additions & 32 deletions migrate.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,82 +35,75 @@ def get_database_url() -> str:
def run_migration(db) -> None:
"""
Run database migrations.

This creates all required tables if they don't exist.
"""
print(f"[{datetime.now().isoformat()}] Starting database migration...")

# Import database module
from quantumpytho.modules.database import init_schema

# Run schema initialization
init_schema(db)

print(f"[{datetime.now().isoformat()}] Migration completed successfully!")


def check_migration_status(db) -> None:
"""Check current migration status."""
print(f"[{datetime.now().isoformat()}] Checking migration status...")

# Check if tables exist
tables = [
'quantum_jobs',
'vqe_results',
'user_sessions',
'api_logs'
]

tables = ["quantum_jobs", "vqe_results", "user_sessions", "api_logs"]

for table in tables:
result = db.fetch_one(
"SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = %s)",
(table,)
(table,),
)
exists = result.get('exists', False) if result else False
exists = result.get("exists", False) if result else False
status = "✅" if exists else "❌"
print(f" {status} {table}")

print(f"[{datetime.now().isoformat()}] Status check complete!")


def rollback_migration(db) -> None:
"""Rollback last migration (use with caution!)."""
print(f"[{datetime.now().isoformat()}] WARNING: Rolling back migrations...")
print(" This will DROP all tables!")

confirm = input(" Are you sure? Type 'YES' to confirm: ")
if confirm != "YES":
print(" Rollback cancelled.")
return

# Drop all tables
tables = ['api_logs', 'user_sessions', 'vqe_results', 'quantum_jobs']
tables = ["api_logs", "user_sessions", "vqe_results", "quantum_jobs"]

for table in tables:
try:
db.execute(f"DROP TABLE IF EXISTS {table} CASCADE")
print(f" ✅ Dropped table: {table}")
except Exception as e:
print(f" ❌ Failed to drop {table}: {e}")

print(f"[{datetime.now().isoformat()}] Rollback complete!")


def main():
"""Main entry point."""
parser = argparse.ArgumentParser(description="QPyth Database Migrations")
parser.add_argument(
"--check",
action="store_true",
help="Check current migration status"
"--check", action="store_true", help="Check current migration status"
)
parser.add_argument(
"--rollback",
action="store_true",
help="Rollback last migration (DROPS all tables)"
help="Rollback last migration (DROPS all tables)",
)
args = parser.parse_args()

# Get database URL
try:
database_url = get_database_url()
Expand All @@ -122,30 +115,31 @@ def main():
print("\nOr create a .env file with:")
print(" DATABASE_URL=postgresql://...")
sys.exit(1)

# Import and connect
try:
from quantumpytho.modules.database import DatabaseConfig, NeonDatabase

config = DatabaseConfig(database_url=database_url)
db = NeonDatabase(config)
print(f"✅ Connected to database")

print("✅ Connected to database")

# Run appropriate command
if args.rollback:
rollback_migration(db)
elif args.check:
check_migration_status(db)
else:
run_migration(db)

# Close connection
db.close()

except Exception as e:
print(f"❌ Migration failed: {e}")
import traceback

traceback.print_exc()
sys.exit(1)

Expand Down
8 changes: 8 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ web = [
"uvicorn[standard]>=0.32.0,<1.0.0",
"slowapi>=0.1.9",
]
docs = [
"mkdocs>=1.5.0,<2.0.0",
"mkdocs-material>=9.0.0,<10.0.0",
"pymdown-extensions>=10.0.0",
]
database = [
"psycopg2-binary>=2.9.9",
]
Expand All @@ -72,6 +77,9 @@ all = [
"fastapi>=0.115.0,<1.0.0",
"uvicorn[standard]>=0.32.0,<1.0.0",
"slowapi>=0.1.9",
"mkdocs>=1.5.0,<2.0.0",
"mkdocs-material>=9.0.0,<10.0.0",
"pymdown-extensions>=10.0.0",
"psycopg2-binary>=2.9.9",
]

Expand Down
Loading
Loading