idZddlZddlmZddlmZddlmZddlm Z m Z m Z ddl m Z ddlmZmZdd lmZGd d Zy) zj Database Manager for AI Trading System Sprint 1: Foundation - Database connection and session management N)contextmanager) Generator)logger) create_engineeventtext)Engine)Session sessionmaker)BasecxeZdZdZddedefdZddZddZe de e ddffd Z defd Z d edefd Zdd Zy)DatabaseManagerz)Manages database connections and sessionsdb_pathechocb||_||_tjtjj |dt d||ddi|_tjtdd}tdd|j |_ tjd |y ) z Initialize database manager Args: db_path: Path to SQLite database file echo: Enable SQL query logging T)exist_okz sqlite:///check_same_threadF)r connect_argsconnectcf|j}|jd|jy)NzPRAGMA foreign_keys=ON)cursorexecuteclose) dbapi_connconnection_recordrs ;/mnt/ssd/data/python-lab/Trading/src/database/db_manager.pyset_sqlite_pragmaz3DatabaseManager.__init__..set_sqlite_pragma+s&&&(F NN3 4 LLN) autocommit autoflushbindzDatabase manager initialized: N)rrosmakedirspathdirnamerenginer listens_forr r SessionLocalrinfo)selfrrrs r__init__zDatabaseManager.__init__s   BGGOOG,t<$ "-u5     69 -  .  )EUQUQ\Q\] 4WI>?rreturnNc tjj|jt j dy#t $r}t jd|d}~wwxYw)zCreate all database tablesr!z$Database tables created successfullyz Error creating database tables: N)r metadata create_allr&rr) Exceptionerrorr*es r create_tableszDatabaseManager.create_tables6sT  MM $ $$++ $ 6 KK> ?  LL;A3? @  ?A A) A$$A)c tjj|jt j dy#t $r}t jd|d}~wwxYw)z,Drop all database tables (use with caution!)r.zAll database tables droppedz Error dropping database tables: N)r r/drop_allr&rwarningr1r2r3s r drop_tableszDatabaseManager.drop_tables?sT  MM " " " 4 NN8 9  LL;A3? @  r6c#K|j} ||j |j y#t$r.}|jt j d|d}~wwxYw#|j wxYww)z Context manager for database sessions Usage: with db_manager.get_session() as session: # Do database operations session.query(Stock).all() zDatabase session error: N)r(commitr1rollbackrr2rr*sessionr4s r get_sessionzDatabaseManager.get_sessionHsu##% M NN  MMO       LL3A37 8   MMOs1B :B  A1)A,,A11A44BB c  |j5}|jtddddtjdy#1swYxYw#t $r"}tj d|Yd}~yd}~wwxYw)z{ Check database connectivity Returns: True if database is accessible, False otherwise zSELECT 1NzDatabase health check: OKTzDatabase health check failed: F)r@rrrr)r1r2r>s r health_checkzDatabaseManager.health_check]ss !!# 2wZ 01 2 KK3 4 2 2  LL9!= > s-AA A AA B A==B table_namec |j5}|jtd|}|j}|cdddS#1swYyxYw#t$r%}t j d|d|Yd}~yd}~wwxYw)z Get row count for a specific table Args: table_name: Name of the table Returns: Number of rows in the table zSELECT COUNT(*) FROM NzError getting count for table z: r)r@rrscalarr1rr2)r*rCr?resultcountr4s rget_table_countzDatabaseManager.get_table_countms !!# w 0Ej\.R)ST      LL9*RsK L s4A/A  A AAA B BBc |jjtjdy#t$r"}tj d|Yd}~yd}~wwxYw)zClose database enginezDatabase connection closedzError closing database: N)r&disposerr)r1r2r3s rrzDatabaseManager.closesK 9 KK   ! KK4 5 9 LL3A37 8 8 9s/2 AAA)zdata/trading_system.dbF)r,N)__name__ __module__ __qualname____doc__strboolr+r5r:rrr r@rBintrHrrrrrsq3@@d@BYwd':;(d ##&9rr)rNr" contextlibrtypingrlogurur sqlalchemyrrrsqlalchemy.enginer sqlalchemy.ormr r src.database.modelsr rrRrrrZs3  %11$0$t9t9r