1- import logging
2-
3-
41class SQL (object ):
52 """Wrap SQLAlchemy to provide a simple SQL API."""
63
@@ -21,6 +18,8 @@ def __init__(self, url, **kwargs):
2118 import sqlalchemy
2219 import sqlite3
2320
21+ from .cs50 import _formatException
22+
2423 # Require that file already exist for SQLite
2524 matches = re .search (r"^sqlite:///(.+)$" , url )
2625 if matches :
@@ -51,17 +50,32 @@ def connect(dbapi_connection, connection_record):
5150 # Register listener
5251 sqlalchemy .event .listen (self ._engine , "connect" , connect )
5352
53+ # Configure logger
54+ self ._logger = logging .getLogger (__name__ )
55+ self ._logger .setLevel (logging .DEBUG )
56+
57+ # Log messages once
58+ self ._logger .propagate = False
59+
60+ ch = logging .StreamHandler ()
61+ ch .setLevel (logging .DEBUG )
62+
63+ formatter = logging .Formatter ("%(levelname)s: %(message)s" )
64+ formatter .formatException = lambda exc_info : _formatException (* exc_info )
65+ ch .setFormatter (formatter )
66+ self ._logger .addHandler (ch )
67+
5468 # Test database
55- disabled = logging . root .disabled
56- logging . root .disabled = True
69+ disabled = self . _logger .disabled
70+ self . _logger .disabled = True
5771 try :
5872 self .execute ("SELECT 1" )
5973 except sqlalchemy .exc .OperationalError as e :
6074 e = RuntimeError (_parse_exception (e ))
6175 e .__cause__ = None
6276 raise e
6377 finally :
64- logging . root .disabled = disabled
78+ self . _logger .disabled = disabled
6579
6680 def __del__ (self ):
6781 """Disconnect from database."""
@@ -342,22 +356,22 @@ def shutdown_session(exception=None):
342356
343357 # If constraint violated, return None
344358 except sqlalchemy .exc .IntegrityError as e :
345- logging .debug (termcolor .colored (statement , "yellow" ))
359+ self . _logger .debug (termcolor .colored (statement , "yellow" ))
346360 e = ValueError (e .orig )
347361 e .__cause__ = None
348362 raise e
349363
350364 # If user error
351365 except (sqlalchemy .exc .OperationalError , sqlalchemy .exc .ProgrammingError ) as e :
352366 self ._disconnect ()
353- logging .debug (termcolor .colored (statement , "red" ))
367+ self . _logger .debug (termcolor .colored (statement , "red" ))
354368 e = RuntimeError (e .orig )
355369 e .__cause__ = None
356370 raise e
357371
358372 # Return value
359373 else :
360- logging .debug (termcolor .colored (_statement , "green" ))
374+ self . _logger .debug (termcolor .colored (_statement , "green" ))
361375 return ret
362376
363377 def _escape (self , value ):
0 commit comments