web-dev-qa-db-fra.com

L'objet 'DatabaseOperations' n'a pas d'erreur 'geo_db_type' dans l'attribut lors d'une synchronisation

J'essaie d'exécuter heroku run python manage.py syncdb sur mon application GeoDjango sur Heroku, mais le message d'erreur suivant s'affiche:

AttributeError: l'objet 'DatabaseOperations' n'a pas d'attribut 'geo_db_type'

Tousdemesrecherches ont donné la même solution: assurez-vous d'utiliser Django.contrib.gis.db.backends.postgis comme moteur de base de données. Le plus drôle est que je le fais déjà (et j'ai aussi Django.contrib.gis dans INSTALLED_APPS):

settings.py

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

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

Y a-t-il autre chose qui me manque? Toute aide est grandement appréciée. Ci-dessous la trace d'erreur complète pour référence:

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'

Mise à jour : J'ai suivi le didacticiel GeoDjango et Didacticiel Heroku/Django , et ai construit une application simple qui fonctionne sur ma machine de développement. Je l'ai poussé vers Heroku à l'aide d'un build personnalisé GeoDjango , et j'ai essayé syncdb, mais j'obtiens la même erreur. Est-ce un problème avec Django/GeoDjango, Heroku ou le buildpack? Mon environnement de développement utilise PostgreSQL 9.1 et PostGIS 2.0, mais Heroku utilise 9.0.9 et 1.5, est-ce le problème?

45
Gady

Le PO utilisait le buildpack GeoDjango, mais au cas où quelqu'un arriverait ici en utilisant Geo buildpack et dj_database_url comme je l'étais, dans settings.py, n'oubliez pas la dernière ligne:

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

METTRE À JOUR

dj_database_urlsupporte directement PostGIS. Vous pouvez vous passer de la dernière ligne du code ci-dessus si vous pouvez modifier l'URL de votre base de données pour qu'elle commence par postgis.

58
wkschwartz

J'ai eu cette erreur en essayant d'exécuter des tests avec la base de test test comme ceci:

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

Problème étant que l'objet sqlite3 DatabaseOperations ne possède pas l'attribut geo_db_type (comme le titre le titre de ce message le suggère). 

Ma solution a été de changer le backend en un moteur SIG équivalent à sqlite:

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

Voir la documentation Django sur l'installation de geodjango pour tous les backends possibles, avec les instructions d'installation: https://docs.djangoproject.com/en/1.9/ref/contrib/gis/install/#spatial-database

19
bozdoz

Cet article est vieux mais je voulais juste partager ma réponse à ce problème. J'utilise le package Dj Database, et je ne savais pas que l'URL de connexion était différente avec PostGIS. La chaîne de connexion pour PostGIS est postgis://USER:PASSWORD@Host:PORT/NAME 

J'espère que ça aide quelqu'un. 

5
Mitch W.

pour moi aidé

1) ajoutez 'Django.contrib.gis', à INSTALLED_APPS
2) changer de 

DATABASES = {
'default': {
    'ENGINE': 'Django.db.backends.mysql',

à 

DATABASES = {
'default': {
    'ENGINE': 'Django.contrib.gis.db.backends.mysql', 
3

J'utilise l'exemple d'application Python sur stack cedar 14 et le pack de construction Heroko heroku/python avec PostGIS. Le problème suivant était que les paramètres de ma base de données ont été écrasés par le mauvais moteur de base de données, ce qui a provoqué heroku run python manage.py migrate échouer avec l'erreur ci-dessus . Le simple fait d'ajouter le moteur dans les paramètres ne changerait rien . Après quelques recherches, j'ai découvert qu'il s'agissait de l'appel à Django_heroku.settings(locals()) dans la dernière ligne si mon settings.py qui revenait à mon changements.

Je l'ai corrigé en écrasant à nouveau le moteur comme ceci en ajoutant une ligne par la suite:

Django_heroku.settings(locals())
DATABASES['default']['ENGINE'] = 'Django.contrib.gis.db.backends.postgis'
0
Marius

J'avais le même problème et je devais changer:

'ENGINE': 'Django.db.backends.postgresql_psycopg2',

à:

'ENGINE': 'Django.contrib.gis.db.backends.postgis',
0
supertramp