Source code for app_utils.database
"""Database related functionality."""
[docs]
class TableSizeMixin:
"""Add a table size functionality to a Django Manager."""
[docs]
def db_table_size(self) -> int:
"""Calculate the database table size in bytes.
This method works for MySQL/MariaDB databases only.
"""
from django.db import connection
is_mysql = connection.settings_dict.get("ENGINE") == "django.db.backends.mysql"
if not is_mysql:
raise RuntimeError("This method only works for MySQL like databases.")
database_name = connection.settings_dict["NAME"]
table_name = self.model._meta.db_table
with connection.cursor() as cursor:
cursor.execute(
"""
SELECT
table_name AS `Table`,
round(data_length + index_length, 2)
FROM information_schema.TABLES
WHERE table_schema = %s
AND table_name = %s;
""",
[database_name, table_name],
)
row = cursor.fetchone()
try:
return int(row[1])
except (TypeError, IndexError, ValueError):
raise ValueError(
f"Failed to calculate table size for {database_name}.{table_name}"
) from None