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
5 months ago
|
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
|
||
|
|