浏览代码

Refs #31196 -- Installed postgis_raster extension on PostGIS 3+.

Claude Paroz 5 年之前
父节点
当前提交
a6b4c07b6e

+ 5 - 0
docs/ref/contrib/gis/install/postgis.txt

@@ -50,6 +50,11 @@ process. An alternative is to use a migration operation in your project::
             ...
         ]
 
+If you plan to use PostGIS raster functionality on PostGIS 3+, you should also
+activate the ``postgis_raster`` extension. You can install the extension using
+the :class:`~django.contrib.postgres.operations.CreateExtension` migration
+operation, or directly by running ``CREATE EXTENSION postgis_raster;``.
+
 GeoDjango does not currently leverage any `PostGIS topology functionality`__.
 If you plan to use those features at some point, you can also install the
 ``postgis_topology`` extension by issuing ``CREATE EXTENSION

+ 18 - 0
tests/gis_tests/gis_migrations/migrations/0001_setup_extensions.py

@@ -0,0 +1,18 @@
+from django.db import connection, migrations
+
+if connection.features.supports_raster:
+    from django.contrib.postgres.operations import CreateExtension
+
+    pg_version = connection.ops.postgis_version_tuple()
+
+    class Migration(migrations.Migration):
+        # PostGIS 3+ requires postgis_raster extension.
+        if pg_version[1:] >= (3,):
+            operations = [
+                CreateExtension('postgis_raster'),
+            ]
+        else:
+            operations = []
+else:
+    class Migration(migrations.Migration):
+        operations = []

+ 3 - 0
tests/gis_tests/gis_migrations/migrations/0001_initial.py → tests/gis_tests/gis_migrations/migrations/0002_create_models.py

@@ -69,4 +69,7 @@ class Migration(migrations.Migration):
     """
     Used for gis-specific migration tests.
     """
+    dependencies = [
+        ('gis_migrations', '0001_setup_extensions'),
+    ]
     operations = ops

+ 2 - 2
tests/gis_tests/gis_migrations/test_commands.py

@@ -36,8 +36,8 @@ class MigrateTests(TransactionTestCase):
         self.assertTableExists("gis_migrations_family")
         if connection.features.supports_raster:
             self.assertTableExists("gis_migrations_heatmap")
-        # Unmigrate everything
-        call_command("migrate", "gis_migrations", "zero", verbosity=0)
+        # Unmigrate models.
+        call_command("migrate", "gis_migrations", "0001", verbosity=0)
         # All tables are gone
         self.assertTableNotExists("gis_migrations_neighborhood")
         self.assertTableNotExists("gis_migrations_household")

+ 18 - 0
tests/gis_tests/rasterapp/migrations/0001_setup_extensions.py

@@ -0,0 +1,18 @@
+from django.db import connection, migrations
+
+if connection.features.supports_raster:
+    from django.contrib.postgres.operations import CreateExtension
+
+    pg_version = connection.ops.postgis_version_tuple()
+
+    class Migration(migrations.Migration):
+        # PostGIS 3+ requires postgis_raster extension.
+        if pg_version[1:] >= (3,):
+            operations = [
+                CreateExtension('postgis_raster'),
+            ]
+        else:
+            operations = []
+else:
+    class Migration(migrations.Migration):
+        operations = []

+ 47 - 0
tests/gis_tests/rasterapp/migrations/0002_rastermodels.py

@@ -0,0 +1,47 @@
+from django.contrib.gis.db import models
+from django.db import migrations
+from django.db.models import deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('rasterapp', '0001_setup_extensions'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='RasterModel',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('rast', models.fields.RasterField(
+                    blank=True,
+                    null=True,
+                    srid=4326,
+                    verbose_name='A Verbose Raster Name',
+                )),
+                ('rastprojected', models.fields.RasterField(
+                    null=True,
+                    srid=3086,
+                    verbose_name='A Projected Raster Table',
+                )),
+                ('geom', models.fields.PointField(null=True, srid=4326)),
+            ],
+            options={
+                'required_db_features': ['supports_raster'],
+            },
+        ),
+        migrations.CreateModel(
+            name='RasterRelatedModel',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('rastermodel', models.ForeignKey(
+                    on_delete=deletion.CASCADE,
+                    to='rasterapp.rastermodel',
+                )),
+            ],
+            options={
+                'required_db_features': ['supports_raster'],
+            },
+        ),
+    ]

+ 0 - 0
tests/gis_tests/rasterapp/migrations/__init__.py