1
+ import logging
2
+
3
+ from .cs50 import _formatException
4
+
5
+
6
+ # Configure logger
7
+ _logger = logging .getLogger (__name__ )
8
+ _logger .setLevel (logging .DEBUG )
9
+
10
+ # Log messages once
11
+ _logger .propagate = False
12
+
13
+ ch = logging .StreamHandler ()
14
+ ch .setLevel (logging .DEBUG )
15
+
16
+ formatter = logging .Formatter ("%(levelname)s: %(message)s" )
17
+ formatter .formatException = lambda exc_info : _formatException (* exc_info )
18
+ ch .setFormatter (formatter )
19
+ _logger .addHandler (ch )
20
+
21
+
1
22
class SQL (object ):
2
23
"""Wrap SQLAlchemy to provide a simple SQL API."""
3
24
@@ -12,14 +33,11 @@ def __init__(self, url, **kwargs):
12
33
"""
13
34
14
35
# Lazily import
15
- import logging
16
36
import os
17
37
import re
18
38
import sqlalchemy
19
39
import sqlite3
20
40
21
- from .cs50 import _formatException
22
-
23
41
# Require that file already exist for SQLite
24
42
matches = re .search (r"^sqlite:///(.+)$" , url )
25
43
if matches :
@@ -50,32 +68,18 @@ def connect(dbapi_connection, connection_record):
50
68
# Register listener
51
69
sqlalchemy .event .listen (self ._engine , "connect" , connect )
52
70
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
71
68
72
# Test database
69
- disabled = self . _logger .disabled
70
- self . _logger .disabled = True
73
+ disabled = _logger .disabled
74
+ _logger .disabled = True
71
75
try :
72
76
self .execute ("SELECT 1" )
73
77
except sqlalchemy .exc .OperationalError as e :
74
78
e = RuntimeError (_parse_exception (e ))
75
79
e .__cause__ = None
76
80
raise e
77
81
finally :
78
- self . _logger .disabled = disabled
82
+ _logger .disabled = disabled
79
83
80
84
def __del__ (self ):
81
85
"""Disconnect from database."""
@@ -356,22 +360,22 @@ def shutdown_session(exception=None):
356
360
357
361
# If constraint violated, return None
358
362
except sqlalchemy .exc .IntegrityError as e :
359
- self . _logger .debug (termcolor .colored (statement , "yellow" ))
363
+ _logger .debug (termcolor .colored (statement , "yellow" ))
360
364
e = ValueError (e .orig )
361
365
e .__cause__ = None
362
366
raise e
363
367
364
368
# If user error
365
369
except (sqlalchemy .exc .OperationalError , sqlalchemy .exc .ProgrammingError ) as e :
366
370
self ._disconnect ()
367
- self . _logger .debug (termcolor .colored (statement , "red" ))
371
+ _logger .debug (termcolor .colored (statement , "red" ))
368
372
e = RuntimeError (e .orig )
369
373
e .__cause__ = None
370
374
raise e
371
375
372
376
# Return value
373
377
else :
374
- self . _logger .debug (termcolor .colored (_statement , "green" ))
378
+ _logger .debug (termcolor .colored (_statement , "green" ))
375
379
return ret
376
380
377
381
def _escape (self , value ):
0 commit comments