diff --git a/bite/telemetry/migrations/0001_initial.py b/bite/telemetry/migrations/0001_initial.py index 8ff1ba3..9a6222a 100644 --- a/bite/telemetry/migrations/0001_initial.py +++ b/bite/telemetry/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1.3 on 2021-03-19 08:08 +# Generated by Django 3.1.7 on 2021-03-25 10:55 import django.core.validators from django.db import migrations, models @@ -18,7 +18,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Telemetry', fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('time', models.DateTimeField(auto_now_add=True, db_index=True)), ('transport', models.CharField(choices=[('http', 'http'), ('mqtt', 'mqtt')], default='http', max_length=4)), ('clock', models.IntegerField(null=True, validators=[django.core.validators.MinValueValidator(0)])), @@ -28,6 +28,7 @@ class Migration(migrations.Migration): options={ 'verbose_name_plural': 'Telemetry', 'ordering': ['-time', 'device'], + 'unique_together': {('time', 'device')}, }, ), ] diff --git a/bite/telemetry/migrations/0002_timescale.py b/bite/telemetry/migrations/0002_timescale.py new file mode 100644 index 0000000..05d1a5d --- /dev/null +++ b/bite/telemetry/migrations/0002_timescale.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1.7 on 2021-03-25 10:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemetry', '0001_initial'), + ] + + # Timescale requires an hyperscale table to have the field used for the + # partitioning ('time') to be in the any UNIQUE constraint. + # Because of that we have a unique_together on 'time' and 'device_id', + # however Django always adds an 'id' as PRIMARY_KEY. + # Django's 'id' isn't used as a foreign key, so we are dropping + # the contraint and simply adding an index to the 'id' columns. + # We can now create the hypertable. + operations = [ + migrations.RunSQL( + "ALTER TABLE telemetry_telemetry DROP CONSTRAINT telemetry_telemetry_pkey ;" # noqa: E501 + "CREATE INDEX telemetry_telemetry_id_idx ON telemetry_telemetry(id);" # noqa: E501 + "SELECT create_hypertable('telemetry_telemetry', 'time');"), + ] diff --git a/bite/telemetry/models.py b/bite/telemetry/models.py index 0feff60..09906f4 100644 --- a/bite/telemetry/models.py +++ b/bite/telemetry/models.py @@ -30,7 +30,6 @@ def telemetry_validation(value): class Telemetry(models.Model): - id = models.AutoField(primary_key=True) device = models.ForeignKey(Device, on_delete=models.CASCADE) time = models.DateTimeField(db_index=True, auto_now_add=True) transport = models.CharField(max_length=4, @@ -43,6 +42,7 @@ class Telemetry(models.Model): class Meta: ordering = ['-time', 'device'] + unique_together = ['time', 'device'] verbose_name_plural = "Telemetry" def __str__(self):