Создание гипертаблицы с помощью timescaleDB и django не удается

У меня есть проект django, и я пытаюсь интегрировать timescaleDB. К сожалению, это не получается, так как django не поддерживает timescaleDB официально. Что нужно сделать, так это несколько ручных миграций. Я попробовал два способа, но оба не работают. Оба способа не работают, потому что мой SQL, написанный вручную, не работает:

  1. Настройка миграции вручную (Проблема: Уникальное ограничение не снимается)

Я следую этому руководству (https://blog.ashtonhudson.com/adding-timescale-to-django.html), которое точно соответствует моему случаю использования.

Сначала я создаю свои модели с меткой времени как pk

from django.db import models
from django.db.models.fields import DateTimeField

class Metric(models.Model):
    drinks = models.CharField(max_length=200)

class TimeData(models.Model):
    # NOTE: We have removed the primary key (unique constraint) manually, since
    # we don't want an id column.
    timestamp = DateTimeField(primary_key=True)
    metric = models.ForeignKey(Parameter, on_delete=models.RESTRICT)
    value = models.FloatField(null=False)

Затем я запускаю миграции и вручную добавляю два SQL-оператора для удаления уникального ограничения с первичного ключа timestamp:

class Migration(migrations.Migration):

    operations = [
        ...
        migrations.CreateModel(
            name="TimeData",
            fields=[
                ("timestamp", models.DateTimeField(primary_key=True, serialize=False)),
                ("value", models.FloatField()),
                (
                    "metric",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.RESTRICT,
                        to="myapp.drinks",
                    ),
                ),
            ],
        ),
        migrations.RunSQL(
            "ALTER TABLE myapp_timedata DROP CONSTRAINT myapp_timedata_pkey;"
        ),
        migrations.RunSQL(
            "SELECT create_hypertable('myapp_timedata', 'timestamp', chunk_time_interval => INTERVAL '5 days');"
        ),
    ]

Это создает гипертаблицу, но все еще существует PK-ограничение на столбце timestamp.

  1. Второе, что я пробую, это вручную написать SQL-миграцию для создания таблицы с составным первичным ключом (не поддерживается django) и затем установить модель на unmanaged (Идея из django con https://www.youtube.com/watch?v=hXctK2NQTsc). Проблема: Это не создает гипертаблицу:

Сначала я пишу эту миграцию вручную:

# Generated manually

from django.db import migrations


class Migration(migrations.Migration):
    dependencies = [
        ...
    ]

    operations = [
        migrations.RunSQL(
            sql=[("CREATE TABLE public.myapp_timeseriesdata ( \
                    value float NOT NULL, \
                    timestamp timestamp NOT NULL, \
                    metric int4 NOT NULL, \
                    CONSTRAINT myapp_timeseriesdata_pkey PRIMARY KEY (timestamp, metric) \
                );",
                  "SELECT create_hypertable('myapp_timeseriesdata', 'timestamp');")],
            reverse_sql=[("DROP TABLE public.myapp_timeseriesdata;")]
        )
    ]

После этого я добавляю модель:

class TimeSeriesData(models.Model):
    timestamp = models.DateTimeField(primary_key=True)
    value = models.FloatField()
    metric = models.ForeignKey(
        Metric, on_delete=models.CASCADE
    )

    class Meta:
        managed = False
        db_table = "myapp_timeseriesdata"
        unique_together = (("metric", "timestamp"),)

Как я уже сказал, это не создает гипертаблицу.

Я думаю, что, возможно, ручной SQL не применяется? Поскольку оба раза кажется, что ручные операторы SQL не работают. У кого-нибудь есть идеи, что происходит? Заранее большое спасибо за любую помощь.

Похоже, что эта строка timestamp = models.DateTimeField(primary_key=True) говорит, что это первичный ключ.

Нужно заменить его, сказав, что это не первичный ключ, и создать композитный первичный ключ.

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