django heroku geodjango

django - Al obtener el objeto ''DatabaseOperations'' no hay ningún atributo ''geo_db_type'' error al hacer un syncdb



heroku geodjango (6)

Estoy intentando ejecutar heroku run python manage.py syncdb en mi aplicación GeoDjango en Heroku, pero me aparece el siguiente error:

AttributeError: el objeto ''DatabaseOperations'' no tiene atributo ''geo_db_type''

All my research arrojó la misma solución: asegúrese de usar django.contrib.gis.db.backends.postgis como motor de la base de datos. Lo curioso es que ya estoy haciendo esto (y también tengo django.contrib.gis en INSTALLED_APPS ):

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

¿Hay algo más que me estoy perdiendo? Cualquier ayuda es muy apreciada, a continuación se muestra el rastro de error completo para referencia:

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''

Actualización : seguí el tutorial de GeoDjango y el tutorial Heroku / Django , y construí una aplicación simple que funciona en mi máquina de desarrollo. Lo empujé a Heroku usando un paquete de construcción GeoDjango personalizado , y probé syncdb, pero obtuve el mismo error. ¿Es esto un problema con Django / GeoDjango, Heroku o el buildpack? Mi entorno de desarrollo está usando PostgreSQL 9.1 y PostGIS 2.0, pero Heroku usa 9.0.9 y 1.5, ¿podría ser ese el problema?


El OP usaba el buildpack de GeoDjango, pero en caso de que alguien llegue aquí usando Geo buildpack y dj_database_url como yo, en settings.py no olvides la última línea:

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


El buildpack fue el principal culpable aquí. En lugar de usar el paquete de construcción de GeoDjango que figura en la página de buildpack de Heroku , utilicé una de sus horquillas que se actualizó más recientemente.

Además, cuando hago un git push heroku master , Heroku crea una base de datos de desarrollo para la aplicación, y cuando hago un syncdb, mi configuración de DATABASES se ignora y Heroku intenta usar la base de datos de desarrollo en cambio ... obviamente un problema, porque dev las bases de datos no pueden / no pueden tener PostGIS instalado. Así que destruí la base de datos de desarrollo después de que se creó con git push (con el buildpack correcto ), luego ejecuté syncdb y funciona.


En python3 recibo el mismo error:

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''

He utilizado correctamente dj-database-url para configurar el motor, sin embargo, sigo viendo el error

Agregué una declaración de impresión para dar salida a mis configuraciones de db ya que están siendo interpretadas por py

En 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''])

Aquí está la instrucción print que da salida a lo que el servidor heroku interpreta como mis credenciales DATABASES[''default''] . Parece que el motor se está configurando correctamente.

{''NAME'': ''name'', ''USER'': ''usr'', ''PASSWORD'': ''pw'', ''HOST'': ''herokuec2host.amazonaws.com'', ''PORT'': 5432, ''CONN_MAX_AGE'': 0, ''ENGINE'': ''django.contrib.gis.db.backends.postgis''}


Esta publicación es antigua, pero solo quería compartir mi respuesta a este problema. Estoy usando el paquete Dj Database, y no sabía que la URL de conexión era diferente cuando usaba PostGIS. La cadena de conexión para PostGIS es postgis://USER:PASSWORD@HOST:PORT/NAME

Espero que esto ayude a alguien.


Obtuve este error al intentar ejecutar pruebas con la prueba db establecida de esta manera:

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

El problema es que el objeto sqlite3 DatabaseOperations no tiene el atributo geo_db_type (como sugiere el título de esta publicación).

Mi solución fue cambiar el backend al motor GIS equivalente sqlite:

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

Consulte los documentos de django en la instalación de geodjango para obtener todos los backends posibles, con las instrucciones de instalación: https://docs.djangoproject.com/en/1.9/ref/contrib/gis/install/#spatial-database


Olvidé comentar las configuraciones de db más abajo en 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)

Estas líneas estaban anulando la configuración que había agregado anteriormente