Разбиение таблиц 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

Поэтому я пока отказываюсь от этой идеи и пытаюсь улучшить производительность, добавляя больше индексов, используя кэширование и т.д.

Вернуться на верх