#28975: Skip automatic creation of postgis extension if it already exists
-------------------------------------+-------------------------------------
     Reporter:  sphrak               |                    Owner:  sphrak
         Type:                       |                   Status:  assigned
  Cleanup/optimization               |
    Component:  Database layer       |                  Version:  2.0
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:  create extension,    |             Triage Stage:  Accepted
  postgis, psycopg2, postgresql      |
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  1                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by sphrak):

 This issue is currently stalled while waiting on response here:
 https://groups.google.com/forum/#!topic/django-developers/EjouxahkqUc


 Replying to [ticket:28975 sphrak]:
 > Hello,
 > I have found an issue with the documentation and/or the behaivor of the
 postgis extension create method.
 >
 > **Background**
 > I am trying to migrate my app that uses the postgis extension inside a
 docker container. I do create the extension beforehand as superuser since
 I dont intend to run the database connection as a postgres superuser.
 >
 > **Problem**
 > As per the documentation found here:
 https://docs.djangoproject.com/en/2.0/ref/contrib/gis/install/postgis/
 >
 >
 > I find it confusing that the documentation states "The command is run
 during the migrate process." and "An alternative is to use a migration
 operation in your project:". Because what seems to be the problem is that
 even if you remove the create extension statement from the migration file,
 it still runs regardless - rendering the option to put the create
 extension statement inside the migration file somewhat redundant and
 probably not very useful.
 >
 > **Possible solution**
 > Ideally the behaivor would be only create extension if its in a
 migration file and if its not - its the users concern to create it however
 it see fit.
 >
 > The relevant part is this:
 > {{{
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/contrib/gis/db/backends/postgis/base.py", line 26, in
 prepare_database
 > testing.api |     cursor.execute("CREATE EXTENSION IF NOT EXISTS
 postgis")
 > }}}
 >
 > Full trace:
 > {{{
 > testing.api | POSTGRES: I'm still down. Standby.
 > testing.api |                               List of databases
 > testing.api |    Name    |  Owner   | Encoding | Collate |  Ctype  |
 Access privileges
 > testing.api |
 -----------+----------+----------+---------+---------+-----------------------
 > testing.api |  postgres  | postgres | UTF8     | C       | C.UTF-8 |
 > testing.api |  template0 | postgres | UTF8     | C       | C.UTF-8 |
 =c/postgres          +
 > testing.api |            |          |          |         |         |
 postgres=CTc/postgres
 > testing.api |  template1 | postgres | UTF8     | C       | C.UTF-8 |
 =c/postgres          +
 > testing.api |            |          |          |         |         |
 postgres=CTc/postgres
 > testing.api |  testing   | postgres | UTF8     | C       | C.UTF-8 |
 =Tc/postgres         +
 > testing.api |            |          |          |         |         |
 postgres=CTc/postgres+
 > testing.api |            |          |          |         |         |
 testing=CTc/postgres
 > testing.api | (4 rows)
 > testing.api |
 > testing.api | POSTGRES: I'm up, I'm up, I'm f***** up - but I'm up
 > testing.api | Collecting selenium==3.3.1 (from -r
 /app/src/core/requirements/testing.txt (line 1))
 > testing.api |   Downloading selenium-3.3.1-py2.py3-none-any.whl (930kB)
 > testing.api | Collecting django-debug-toolbar==1.8 (from -r
 /app/src/core/requirements/testing.txt (line 2))
 > testing.api |   Downloading django_debug_toolbar-1.8-py2.py3-none-
 any.whl (205kB)
 > testing.api | Requirement already satisfied: Django>=1.8 in
 /usr/lib/python3.6/site-packages (from django-debug-toolbar==1.8->-r
 /app/src/core/requirements/testing.txt (line 2))
 > testing.api | Collecting sqlparse>=0.2.0 (from django-debug-
 toolbar==1.8->-r /app/src/core/requirements/testing.txt (line 2))
 > testing.api |   Downloading sqlparse-0.2.4-py2.py3-none-any.whl
 > testing.api | Requirement already satisfied: pytz in /usr/lib/python3.6
 /site-packages (from Django>=1.8->django-debug-toolbar==1.8->-r
 /app/src/core/requirements/testing.txt (line 2))
 > testing.api | Installing collected packages: selenium, sqlparse, django-
 debug-toolbar
 > testing.api | Successfully installed django-debug-toolbar-1.8
 selenium-3.3.1 sqlparse-0.2.4
 > testing.api | Traceback (most recent call last):
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 83, in _execute
 > testing.api |     return self.cursor.execute(sql)
 > testing.api | psycopg2.ProgrammingError: permission denied to create
 extension "postgis"
 > testing.api | HINT:  Must be superuser to create this extension.
 > testing.api |
 > testing.api |
 > testing.api | The above exception was the direct cause of the following
 exception:
 > testing.api |
 > testing.api | Traceback (most recent call last):
 > testing.api |   File "manage.py", line 22, in <module>
 > testing.api |     execute_from_command_line(sys.argv)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/core/management/__init__.py", line 371, in
 execute_from_command_line
 > testing.api |     utility.execute()
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/core/management/__init__.py", line 365, in execute
 > testing.api |
 self.fetch_command(subcommand).run_from_argv(self.argv)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/core/management/base.py", line 288, in run_from_argv
 > testing.api |     self.execute(*args, **cmd_options)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/core/management/base.py", line 335, in execute
 > testing.api |     output = self.handle(*args, **options)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/core/management/commands/migrate.py", line 77, in handle
 > testing.api |     connection.prepare_database()
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/contrib/gis/db/backends/postgis/base.py", line 26, in
 prepare_database
 > testing.api |     cursor.execute("CREATE EXTENSION IF NOT EXISTS
 postgis")
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 100, in execute
 > testing.api |     return super().execute(sql, params)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 68, in execute
 > testing.api |     return self._execute_with_wrappers(sql, params,
 many=False, executor=self._execute)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
 > testing.api |     return executor(sql, params, many, context)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 85, in _execute
 > testing.api |     return self.cursor.execute(sql, params)
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/db/utils.py", line 89, in __exit__
 > testing.api |     raise dj_exc_value.with_traceback(traceback) from
 exc_value
 > testing.api |   File "/usr/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 83, in _execute
 > testing.api |     return self.cursor.execute(sql)
 > testing.api | django.db.utils.ProgrammingError: permission denied to
 create extension "postgis"
 > testing.api | HINT:  Must be superuser to create this extension.
 > }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/28975#comment:7>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/064.4dfc2a4a1397dd843974860ce66e267b%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to