Создание гипертаблицы с помощью timescaleDB и django не удается
У меня есть проект django, и я пытаюсь интегрировать timescaleDB. К сожалению, это не получается, так как django не поддерживает timescaleDB официально. Что нужно сделать, так это несколько ручных миграций. Я попробовал два способа, но оба не работают. Оба способа не работают, потому что мой SQL, написанный вручную, не работает:
- Настройка миграции вручную (Проблема: Уникальное ограничение не снимается)
Я следую этому руководству (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.
- Второе, что я пробую, это вручную написать 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)
говорит, что это первичный ключ.
Нужно заменить его, сказав, что это не первичный ключ, и создать композитный первичный ключ.