From d887c3be9117520d25a835d93f318a04a9ebfc0c Mon Sep 17 00:00:00 2001 From: MarkLo127 Date: Thu, 12 Mar 2026 12:02:36 +0800 Subject: [PATCH] --- .claude/worktrees/dazzling-leakey | 1 + backend/app/db/database.py | 50 +++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 15 deletions(-) create mode 160000 .claude/worktrees/dazzling-leakey diff --git a/.claude/worktrees/dazzling-leakey b/.claude/worktrees/dazzling-leakey new file mode 160000 index 00000000..b8454fef --- /dev/null +++ b/.claude/worktrees/dazzling-leakey @@ -0,0 +1 @@ +Subproject commit b8454fefc775fa273b57d0932ff3e52370763604 diff --git a/backend/app/db/database.py b/backend/app/db/database.py index b92df752..11b83753 100644 --- a/backend/app/db/database.py +++ b/backend/app/db/database.py @@ -61,24 +61,44 @@ async def init_db(): return async with engine.begin() as conn: - # Create all tables + # Create all tables first await conn.run_sync(Base.metadata.create_all) # Manual migrations for existing databases try: - # Add language column if it doesn't exist - await conn.execute(text("ALTER TABLE reports ADD COLUMN IF NOT EXISTS language VARCHAR(10);")) - # Add indexes to optimize queries - await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_reports_user_id ON reports (user_id);")) - await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_reports_created_at ON reports (created_at);")) - # Add composite index for common query pattern (user_id + created_at DESC) - await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_reports_user_created ON reports (user_id, created_at DESC);")) - # Add index for language filtering - await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_reports_language ON reports (language);")) - # Add composite index for user + market_type + language queries - await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_reports_user_market_lang ON reports (user_id, market_type, language);")) - # Covering index for counts query (GROUP BY market_type with language filter) - await conn.execute(text("CREATE INDEX IF NOT EXISTS ix_reports_user_market_lang_count ON reports (user_id, market_type, COALESCE(language, 'zh-TW'));")) + # Check if reports table exists + result = await conn.execute(text(""" + SELECT EXISTS ( + SELECT FROM information_schema.tables + WHERE table_name = 'reports' + ) + """)) + table_exists = result.scalar() + + if table_exists: + # Add language column if it doesn't exist + await conn.execute(text(""" + ALTER TABLE reports ADD COLUMN IF NOT EXISTS language VARCHAR(10); + """)) + # Add indexes to optimize queries + await conn.execute(text(""" + CREATE INDEX IF NOT EXISTS ix_reports_user_id ON reports (user_id); + """)) + await conn.execute(text(""" + CREATE INDEX IF NOT EXISTS ix_reports_created_at ON reports (created_at); + """)) + # Add composite index for common query pattern (user_id + created_at DESC) + await conn.execute(text(""" + CREATE INDEX IF NOT EXISTS ix_reports_user_created ON reports (user_id, created_at DESC); + """)) + # Add index for language filtering + await conn.execute(text(""" + CREATE INDEX IF NOT EXISTS ix_reports_language ON reports (language); + """)) + # Add composite index for user + market_type + language queries + await conn.execute(text(""" + CREATE INDEX IF NOT EXISTS ix_reports_user_market_lang ON reports (user_id, market_type, language); + """)) except Exception as e: print(f"Skipping manual migration (might be SQLite or syntax not supported): {e}") @@ -96,4 +116,4 @@ async def check_db_connection(): return True except Exception as e: print(f"Database connection failed: {e}") - return False + return False \ No newline at end of file