mirror of
https://github.com/Xe138/AI-Trader.git
synced 2026-04-12 05:27:24 -04:00
feat: drop old schema tables (trading_sessions, positions, reasoning_logs)
- Created migration script to drop old tables - Removed old table creation from database.py - Added tests to verify old tables are removed and new tables exist - Migration script can be run standalone with: PYTHONPATH=. python api/migrations/002_drop_old_schema.py
This commit is contained in:
@@ -156,38 +156,10 @@ def initialize_database(db_path: str = "data/jobs.db") -> None:
|
|||||||
# )
|
# )
|
||||||
# """)
|
# """)
|
||||||
|
|
||||||
# Table 5: Trading Sessions - One per model-day trading session
|
# OLD TABLES REMOVED:
|
||||||
cursor.execute("""
|
# - trading_sessions → replaced by trading_days
|
||||||
CREATE TABLE IF NOT EXISTS trading_sessions (
|
# - reasoning_logs → replaced by trading_days.reasoning_full (JSON column)
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
# See api/migrations/002_drop_old_schema.py for removal migration
|
||||||
job_id TEXT NOT NULL,
|
|
||||||
date TEXT NOT NULL,
|
|
||||||
model TEXT NOT NULL,
|
|
||||||
session_summary TEXT,
|
|
||||||
started_at TEXT NOT NULL,
|
|
||||||
completed_at TEXT,
|
|
||||||
total_messages INTEGER,
|
|
||||||
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,
|
|
||||||
UNIQUE(job_id, date, model)
|
|
||||||
)
|
|
||||||
""")
|
|
||||||
|
|
||||||
# Table 6: Reasoning Logs - AI decision logs linked to sessions
|
|
||||||
cursor.execute("""
|
|
||||||
CREATE TABLE IF NOT EXISTS reasoning_logs (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
session_id INTEGER NOT NULL,
|
|
||||||
message_index INTEGER NOT NULL,
|
|
||||||
role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'tool')),
|
|
||||||
content TEXT NOT NULL,
|
|
||||||
summary TEXT,
|
|
||||||
tool_name TEXT,
|
|
||||||
tool_input TEXT,
|
|
||||||
timestamp TEXT NOT NULL,
|
|
||||||
FOREIGN KEY (session_id) REFERENCES trading_sessions(id) ON DELETE CASCADE,
|
|
||||||
UNIQUE(session_id, message_index)
|
|
||||||
)
|
|
||||||
""")
|
|
||||||
|
|
||||||
# Table 7: Tool Usage - Tool usage statistics
|
# Table 7: Tool Usage - Tool usage statistics
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
|
|||||||
42
api/migrations/002_drop_old_schema.py
Normal file
42
api/migrations/002_drop_old_schema.py
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
"""Drop old schema tables (trading_sessions, positions, reasoning_logs)."""
|
||||||
|
|
||||||
|
|
||||||
|
def drop_old_schema(db):
|
||||||
|
"""
|
||||||
|
Drop old schema tables that have been replaced by new schema.
|
||||||
|
|
||||||
|
Old schema:
|
||||||
|
- trading_sessions → replaced by trading_days
|
||||||
|
- positions (action-centric) → replaced by trading_days + actions + holdings
|
||||||
|
- reasoning_logs → replaced by trading_days.reasoning_full
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: Database instance
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Drop reasoning_logs (child table first)
|
||||||
|
db.connection.execute("DROP TABLE IF EXISTS reasoning_logs")
|
||||||
|
|
||||||
|
# Drop positions (note: this is the OLD action-centric positions table)
|
||||||
|
# The new schema doesn't have a positions table at all
|
||||||
|
db.connection.execute("DROP TABLE IF EXISTS positions")
|
||||||
|
|
||||||
|
# Drop trading_sessions
|
||||||
|
db.connection.execute("DROP TABLE IF EXISTS trading_sessions")
|
||||||
|
|
||||||
|
db.connection.commit()
|
||||||
|
|
||||||
|
print("✅ Dropped old schema tables: trading_sessions, positions, reasoning_logs")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
"""Run migration standalone."""
|
||||||
|
from api.database import Database
|
||||||
|
from tools.deployment_config import get_db_path
|
||||||
|
|
||||||
|
db_path = get_db_path("data/trading.db")
|
||||||
|
db = Database(db_path)
|
||||||
|
|
||||||
|
drop_old_schema(db)
|
||||||
|
|
||||||
|
print(f"✅ Migration complete: {db_path}")
|
||||||
42
tests/unit/test_old_schema_removed.py
Normal file
42
tests/unit/test_old_schema_removed.py
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
"""Verify old schema tables are removed."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from api.database import Database
|
||||||
|
|
||||||
|
|
||||||
|
def test_old_tables_do_not_exist():
|
||||||
|
"""Verify trading_sessions, old positions, reasoning_logs don't exist."""
|
||||||
|
|
||||||
|
db = Database(":memory:")
|
||||||
|
|
||||||
|
# Query sqlite_master for old tables
|
||||||
|
cursor = db.connection.execute("""
|
||||||
|
SELECT name FROM sqlite_master
|
||||||
|
WHERE type='table' AND name IN (
|
||||||
|
'trading_sessions', 'reasoning_logs'
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
|
tables = cursor.fetchall()
|
||||||
|
|
||||||
|
assert len(tables) == 0, f"Old tables should not exist, found: {tables}"
|
||||||
|
|
||||||
|
|
||||||
|
def test_new_tables_exist():
|
||||||
|
"""Verify new schema tables exist."""
|
||||||
|
|
||||||
|
db = Database(":memory:")
|
||||||
|
|
||||||
|
cursor = db.connection.execute("""
|
||||||
|
SELECT name FROM sqlite_master
|
||||||
|
WHERE type='table' AND name IN (
|
||||||
|
'trading_days', 'holdings', 'actions'
|
||||||
|
)
|
||||||
|
ORDER BY name
|
||||||
|
""")
|
||||||
|
|
||||||
|
tables = [row[0] for row in cursor.fetchall()]
|
||||||
|
|
||||||
|
assert 'trading_days' in tables
|
||||||
|
assert 'holdings' in tables
|
||||||
|
assert 'actions' in tables
|
||||||
Reference in New Issue
Block a user