forked from jazzband/django-silk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql.py
58 lines (49 loc) · 1.64 KB
/
sql.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import logging
import traceback
from django.db.models.sql import EmptyResultSet
from django.utils import timezone
from silk.collector import DataCollector
from silk.config import SilkyConfig
Logger = logging.getLogger('silk.sql')
def _should_wrap(sql_query):
if not DataCollector().request:
return False
for ignore_str in SilkyConfig().SILKY_IGNORE_QUERIES:
if ignore_str in sql_query:
return False
return True
def execute_sql(self, *args, **kwargs):
"""wrapper around real execute_sql in order to extract information"""
try:
q, params = self.as_sql()
if not q:
raise EmptyResultSet
except EmptyResultSet:
try:
result_type = args[0]
except IndexError:
result_type = kwargs.get('result_type', 'multi')
if result_type == 'multi':
return iter([])
else:
return
tb = ''.join(reversed(traceback.format_stack()))
sql_query = q % params
if _should_wrap(sql_query):
query_dict = {
'query': sql_query,
'start_time': timezone.now(),
'traceback': tb
}
try:
return self._execute_sql(*args, **kwargs)
finally:
query_dict['end_time'] = timezone.now()
request = DataCollector().request
if request:
query_dict['request'] = request
if self.query.model.__module__ != 'silk.models':
DataCollector().register_query(query_dict)
else:
DataCollector().register_silk_query(query_dict)
return self._execute_sql(*args, **kwargs)