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