L'objet Getting 'DatabaseOperations' n'a pas d'erreur d'attribut 'geo db type' lorsqu'il fait une syncdb

j'essaie de courir heroku run python manage.py syncdb sur mon application GeoDjango sur Heroku, mais j'obtiens l'erreur suivante:

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

monrecherche a donné la même solution: assurez-vous d'utiliser django.contrib.gis.db.backends.postgis le moteur de base de données. La chose 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 est la trace complète de l'erreur 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 tutorial GeoDjango et Heroku / Django tutorial, et construit une application simple qui fonctionne sur ma machine de dev. Je l'ai poussé à Heroku en utilisant un personnaliser GeoDjango buildpack, et essayé syncdb, mais obtenir la même erreur. Est-ce un problème avec Django/GeoDjango, Heroku, ou le buildpack? Mon environnement dev utilise PostgreSQL 9.1 et PostGIS 2.0, mais Heroku utilise 9.0.9 et 1.5, cela pourrait-il être le problème?

41
demandé sur Gady 2012-09-22 01:37:59

7 réponses

L'OP a l'aide de la GeoDjango buildpack, mais au cas où quelqu'un arrive ici à l'aide de 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'
52
répondu wkschwartz 2014-01-23 19:28:50

j'ai eu cette erreur en essayant d'exécuter des tests avec le test db réglé comme ceci:

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

le problème étant que le sqlite3 DatabaseOperations l'objet n'a pas l'attribut geo_db_type (comme le suggère le titre de ce billet).

ma solution a été de changer le backend vers le moteur GIS équivalent sqlite:

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

voir les docs de 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

17
répondu bozdoz 2016-06-15 03:44:43

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

Espérons que cela aide quelqu'un.

5
répondu Mitch W. 2016-03-29 05:07:46

pour m'aidé

1) ajouter 'django.contrib.gis',INSTALLED_APPS

2) changement de

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

DATABASES = {
'default': {
    'ENGINE': 'django.contrib.gis.db.backends.mysql', 
1
répondu Ryabchenko Alexander 2018-09-09 16:10:54

En python3, je reçois le même message d'erreur:

  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 673, in db_parameters
    type_string = self.db_type(connection)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/gis/db/models/fields.py", line 105, in db_type
    return connection.ops.geo_db_type(self)
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'

j'ai bien utilisé dj-database-url pour régler le moteur, cependant je vois encore l'erreur

j'ai ajouté une instruction d'impression pour afficher mes configurations de base de données telles qu'elles sont interprétées par py

settings.py:

if os.getenv('DYNO'):
    GDAL_LIBRARY_PATH = os.path.expandvars(os.getenv('GDAL_LIBRARY_PATH'))
    GEOS_LIBRARY_PATH = os.path.expandvars(os.getenv('GEOS_LIBRARY_PATH'))
    DATABASES['default'] =  dj_database_url.parse(os.getenv('DATABASE_URL'),'django.contrib.gis.db.backends.postgis')
    print(DATABASES['default'])

Voici la déclaration d'impression sortant ce que le serveur heroku interprète comme mon DATABASES['default'] lettres de créance. Il semble que le moteur est correctement définie.

{'NAME': 'name', 'USER': 'usr', 'PASSWORD': 'pw', 'HOST': 'herokuec2host.amazonaws.com', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.contrib.gis.db.backends.postgis'}
0
répondu Sillson 2018-04-22 19:32:42

j'ai oublié de commenter les paramètres db plus bas dans 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)

ces lignes surpassent les paramètres que j'ai ajoutés au-dessus de

-1
répondu Tristan 2017-03-02 04:29:53

Le buildpack a été le principal coupable ici. Au lieu D'utiliser le buildpack GeoDjango listé sur Heroku est buildpack page, j'ai utilisé l'un de ses fourches qui a été mis à jour plus récemment.

Aussi, quand je fais un git push heroku master, Heroku crée une base de données dev pour l'application, et quand je fais une syncdb,mon DATABASES paramètre est ignoré et Heroku essaie d'utiliser la base de données dev plutôt... évidemment un problème, parce que les bases de données dev ne peuvent pas / ne peuvent pas avoir PostGIS installer. Donc j'ai détruit la base de données dev après qu'elle ait été créée avec le git push (avec corriger buildpack), puis lancé syncdb et il fonctionne.

-2
répondu Gady 2012-09-28 16:25:35