Разбиение таблиц Django Postgres не работает с командой 'pgpartition'
У меня есть огромная таблица "Logs" postgres, которая активно используется в моем проекте Django. Таблица Logs содержит более 20 миллионов записей и замедляет выполнение запросов, а также увеличивает время загрузки страницы. Я использую следующие версии Django и Postgres:-. Django: 4.0 Postgres: 13
Я прочитал о разделении таблиц и решил использовать "django-postgres-extra", так как не хочу управлять файлами миграции.
Я выполнил все шаги, указанные в ссылке ниже, но у меня не получается создать разделенные таблицы с помощью команды "pgpartition". https://django-postgres-extra.readthedocs.io/en/master/table_partitioning.html
Я что-то упустил? Изменения в models.py:-
from django.db import models
from psqlextra.types import PostgresPartitioningMethod
from psqlextra.models import PostgresPartitionedModel
from psqlextra.manager import PostgresManager
class Logs(PostgresPartitionedModel):
class PartitioningMeta:
method = PostgresPartitioningMethod.RANGE
key = ["ctime"]
objects = PostgresManager()
ctime = models.DateTimeField(auto_now_add=True)
logname = models.CharField(max_length=20)
builds = models.ForeignKey(Build)
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.postgres',
'psqlextra',
'logs',
]
DATABASES = {
'default': {
'ENGINE': 'psqlextra.backend',
'NAME': 'logdb',
'USER': 'root',
'PASSWORD': 'crypt',
'HOST': 'localhost',
'PORT': 5432,
}
}
PSQLEXTRA_PARTITIONING_MANAGER = 'logs.partition.manager'
Создал файл с именем 'partition' в приложении logs и определил объект менеджера в соответствии с приведенной выше ссылкой на документ. partition.py
from dateutil.relativedelta import relativedelta
from logs.models import Logs
from psqlextra.partitioning import (
PostgresPartitioningManager,
PostgresCurrentTimePartitioningStrategy,
PostgresTimePartitionSize,
partition_by_current_time,
)
from psqlextra.partitioning.config import PostgresPartitioningConfig
manager = PostgresPartitioningManager([
# 3 partitions ahead, each partition is one month
# delete partitions older than 6 months
# partitions will be named `[table_name]_[year]_[3-letter month name]`.
PostgresPartitioningConfig(
model=Logs,
strategy=PostgresCurrentTimePartitioningStrategy(
size=PostgresTimePartitionSize(months=1),
count=1,
max_age=relativedelta(months=1),
),
),
])
Когда я выполнил команду "python manage.py pgmakemigrations", она создала файл миграции, как показано ниже:- 0002_alter_log_managers.py
# Generated by Django 4.0.3 on 2022-05-19 12:22
from django.db import migrations
import psqlextra.manager.manager
class Migration(migrations.Migration):
dependencies = [
('logs', '0001_initial'),
]
operations = [
migrations.AlterModelManagers(
name='logs',
managers=[
('objects', psqlextra.manager.manager.PostgresManager()),
],
),
]
Но как только я запускаю команду "pgpartition", я получаю следующую ошибку:-
python manage.py pgpartition
Traceback (most recent call last):
File "/home/user/party/manage.py", line 22, in <module>
main()
File "/home/user/party/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/user/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/home/user/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/user/venv/lib/python3.10/site-packages/django/core/management/base.py", line 414, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/user/venv/lib/python3.10/site-packages/django/core/management/base.py", line 460, in execute
output = self.handle(*args, **options)
File "/home/user/venv/lib/python3.10/site-packages/psqlextra/management/commands/pgpartition.py", line 72, in handle
plan = partitioning_manager.plan(
File "/home/user/venv/lib/python3.10/site-packages/psqlextra/partitioning/manager.py", line 52, in plan
model_plan = self._plan_for_config(
File "/home/user/venv/lib/python3.10/site-packages/psqlextra/partitioning/manager.py", line 84, in _plan_for_config
table = self._get_partitioned_table(connection, config.model)
File "/home/user/venv/lib/python3.10/site-packages/psqlextra/partitioning/manager.py", line 121, in _get_partitioned_table
raise PostgresPartitioningError(
psqlextra.partitioning.error.PostgresPartitioningError: Model Logs, with table logs_logs does not exists in the database. Did you run `python manage.py migrate`?
Не уверен, что я здесь что-то упускаю...
Похоже, что "django-postgres-extra" используется только для декларативного разделения. Т.е. когда мы предвидим, что таблица в будущем может вырасти в размерах, мы можем использовать декларативное разделение при создании таблицы в самом начале.
https://www.postgresql.org/docs/current/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE
Поэтому я пока отказываюсь от этой идеи и пытаюсь улучшить производительность, добавляя больше индексов, используя кэширование и т.д.