Подтвердить что ты не робот

Получение объекта "DatabaseOperations" не имеет атрибута "geo_db_type" при выполнении syncdb

Я пытаюсь запустить heroku run python manage.py syncdb в своем приложении GeoDjango на Heroku, но я получаю следующую ошибку:

AttributeError: объект DatabaseOperations не имеет атрибута 'geo_db_type'

Все my дал такое же решение: не забудьте использовать django.contrib.gis.db.backends.postgis в качестве механизма базы данных. Смешно, что я уже делаю это (и у меня также есть django.contrib.gis в INSTALLED_APPS):

settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.contrib.gis.db.backends.postgis',
    'NAME': '...',
    'HOST': '...',
    'PORT': ...,
    'USER': '...',
    'PASSWORD': '...'
  }
}

INSTALLED_APPS = (
    ...,
    'django.contrib.gis',
)

Есть ли что-то еще, что мне не хватает? Любая помощь приветствуется, ниже приведена полная трассировка ошибок для справки:

Running `python manage.py syncdb` attached to terminal... up, run.1
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/app/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 91, in handle_noargs
    sql, references = connection.creation.sql_create_model(model, self.style, seen_models)
  File "/app/lib/python2.7/site-packages/django/db/backends/creation.py", line 44, in sql_create_model
    col_type = f.db_type(connection=self.connection)
  File "/app/lib/python2.7/site-packages/django/contrib/gis/db/models/fields.py", line 200, in db_type
    return connection.ops.geo_db_type(self)
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'

Обновление. Я выполнил учебник GeoDjango и учебник по Heroku/Django, и построил простое приложение, которое работает на моей машине dev. Я подтолкнул его к Heroku с помощью настраиваемого GeoDjango buildpack и попробовал syncdb, но получил ту же ошибку. Это проблема с Django/GeoDjango, Heroku или buildpack? Моя среда dev использует PostgreSQL 9.1 и PostGIS 2.0, но Heroku использует 9.0.9 и 1.5, может быть, проблема?

4b9b3361

Ответ 1

Здесь был основным виновником. Вместо использования сборщика GeoDjango, указанного на странице Heroku buildpack, я использовал один из это вилки, которые были обновлены совсем недавно.

Кроме того, когда я делаю git push heroku master, Heroku создает базу данных dev для приложения, а когда я делаю syncdb, параметр my DATABASES игнорируется, и Heroku пытается использовать dev база данных вместо этого... очевидно, проблема, потому что базы данных разработчиков не имеют/не могут устанавливать PostGIS. Поэтому я уничтожил базу данных dev после того, как она была создана с помощью git pushправильный сборщик), затем запустил syncdb, и он работает.

Ответ 2

OP использовал GeoDjango buildpack, но в случае, если кто-то получает здесь Geo buildpack и dj_database_url, как я был, в settings.py не забывайте последняя строка:

import dj_database_url
DATABASES['default'] = dj_database_url.config()
DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'

Ответ 3

Я получил эту ошибку при попытке выполнить тесты с тестовым db следующим образом:

if 'test' in sys.argv:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', 
            'NAME': '_testdb',
        }
    }

Проблема заключается в том, что объект sqlite3 DatabaseOperations не имеет атрибута geo_db_type (как и название этого сообщения).

Мое решение состояло в том, чтобы изменить бэкэнд на эквивалентный SQL-движок с использованием SQL-запросов:

        'ENGINE': 'django.contrib.gis.db.backends.spatialite'

См. документы django по установке geodjango для всех возможных бэкендов с инструкциями по установке: https://docs.djangoproject.com/en/1.9/ref/contrib/gis/install/#spatial-database

Ответ 4

Этот пост старый, но я просто хотел поделиться своим ответом на эту проблему. Я использую пакет Dj Database, и я не знал, что URL-адрес соединения отличается при использовании PostGIS. Строка подключения для PostGIS: postgis://USER:[email protected]:PORT/NAME

Надеюсь, это поможет кому-то.

Ответ 5

Я забыл прокомментировать настройки db ниже в settings.py:

# Update database configuration with $DATABASE_URL.
#db_from_env = dj_database_url.config(conn_max_age=500)
#DATABASES['default'].update(db_from_env)

Эти строки перекрывали настройки, которые я добавил выше