mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.6 KiB
55 lines
1.6 KiB
from django.apps import apps |
|
from orgs.utils import tmp_to_root_org |
|
|
|
__all__ = ['DBTableDataAnalyzer'] |
|
|
|
|
|
class DBTableDataAnalyzer(object): |
|
|
|
def get_tables_info(self): |
|
table_models = self.get_all_table_models() |
|
with tmp_to_root_org(): |
|
table_info = self._fetch_tables_info(table_models) |
|
return table_info |
|
|
|
def get_all_table_models(self): |
|
# construct tables models |
|
table_models = set() |
|
for model in apps.get_models(): |
|
table_models.add(model) |
|
for m2m_field in model._meta.many_to_many: |
|
table_models.add(m2m_field.remote_field.through) |
|
return table_models |
|
|
|
def _fetch_tables_info(self, table_models): |
|
""" |
|
return: |
|
info = { |
|
'table_name': { |
|
'count': 100 |
|
} |
|
... |
|
} |
|
""" |
|
info = {} |
|
for table_model in table_models: |
|
if table_model._meta.proxy == True: |
|
# skip proxy model |
|
continue |
|
count = self._fetch_row_count(table_model) |
|
data = { |
|
"count": count |
|
} |
|
table_name = table_model._meta.db_table |
|
info.update({f"{table_name}": data}) |
|
return info |
|
|
|
def _fetch_row_count(self, table_model): |
|
# fetch table row count |
|
if hasattr(table_model, 'objects_raw'): |
|
# use objects_raw to count |
|
count = table_model.objects_raw.count() |
|
else: |
|
count = table_model.objects.count() |
|
return count |
|
|