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?
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'
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
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.
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',
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'}
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
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.