升级到Django 1.8后的Postgis迁移错误

ssp*_*oss 5 postgis postgresql-9.3 django-1.8

我正在使用postgres数据库和postgis扩展.现在,在升级到Django 1.8之后,我在运行时收到此错误manage.py migrate:

Traceback (most recent call last):
  File "./manage.py", line 13, in <module>
    execute_from_command_line(sys.argv)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 91, in handle
    connection.prepare_database()
  File "/my-project/env/lib/python2.7/site-packages/django/contrib/gis/db/backends/postgis/base.py", line 39, in prepare_database
    cursor.execute("CREATE EXTENSION IF NOT EXISTS postgis")
  File "/my-project/env/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/my-project/env/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/my-project/env/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/my-project/env/lib/python2.7/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
django.db.utils.ProgrammingError: type "spheroid" already exists
Run Code Online (Sandbox Code Playgroud)

版本

我在OS X上使用Postgres.app

  • psql(9.3.4)
  • SELECT PostGIS_version(); postgis_version 2.1 USE_GEOS=1 USE_PROJ=1USE_STATS=1
  • Django 1.8.2

ssp*_*oss 3

好吧,我解决了。

首先,我升级了 postgres 和 postgis,用最新的 Postgres.app 替换了 Postgres.app 并升级了brew软件包。之后,我收到以下错误:

Traceback (most recent call last):
  File "./manage.py", line 13, in <module>
    execute_from_command_line(sys.argv)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/my-project/env/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 91, in handle
    connection.prepare_database()
  File "/my-project/env/lib/python2.7/site-packages/django/contrib/gis/db/backends/postgis/base.py", line 39, in prepare_database
    cursor.execute("CREATE EXTENSION IF NOT EXISTS postgis")
  File "/my-project/env/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/my-project/env/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/my-project/env/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/my-project/env/lib/python2.7/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
django.db.utils.InternalError: PostGIS is already installed in schema 'public', uninstall it first
Run Code Online (Sandbox Code Playgroud)

然后我执行了“硬升级”,如下所述http://postgis.net/docs/manual-2.1/postgis_installation.html#upgrading

所有步骤(包括硬升级)

  1. pg_dump -U $PGUSER -Fc -b -v -f "your_db.backup" your_db
  2. psql -U $PGUSER -d postgres -c "DROP DATABASE your_db;"
  3. brew uninstall postgresql93 && brew install postgresql或者brew upgrade postgresql
  4. brew uninstall postgis15 && brew install postgis或者brew upgrade postgis
  5. 将 Postgres.app 替换为最新的
  6. pip uninstall psycopg2 && pip install psycopg2
  7. psql -U $PGUSER -d postgres -c "CREATE DATABASE your_db;"
  8. psql -U $PGUSER -d your_db -c "CREATE EXTENSION postgis;"
  9. /usr/local/share/postgis/postgis_restore.pl your_db.backup | psql -U $PGUSER your_db 2> errors.txt