2012-09-21 20 views
34

Estoy intentando ejecutar heroku run python manage.py syncdb en mi aplicación GeoDjango en Heroku, pero me da el siguiente error:Conseguir objeto '' DatabaseOperations no tiene atributo de error 'geo_db_type' cuando se hace una syncdb

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

Allofmyresearch ha dado la misma solución: asegúrese de usar django.contrib.gis.db.backends.postgis como el motor de 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 alguna otra cosa que me falta? Cualquier ayuda es muy apreciada, a continuación es la traza 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: Me siguió el GeoDjango tutorial y Heroku/Django tutorial, y construyó una aplicación sencilla que funciona en mi máquina dev. Lo empujé a Heroku usando un custom GeoDjango buildpack, 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?

Respuesta

-1

El buildpack fue el principal culpable aquí. En lugar de utilizar el buildpack GeoDjango que figura en Heroku's buildpack page, utilicé one of it's forks que se actualizó más recientemente.

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

+0

, sigo recibiendo este error después de usar el paquete de compilación personalizado. – limovala

+6

Si bien la pregunta es específica de Heroku, el título es bastante general. El problema también puede surgir si Django DATABASES ENGINE no está configurado para django.contrib.gis.db.backends.postgis –

42

El PO fue el uso de la buildpack GeoDjango, pero en caso de que alguien llegue aquí usando Geo buildpack y dj_database_url como yo, en settings.py no se olvide de la última línea:

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

gracias! esto funcionó perfectamente para mí – frankV

+1

se encontró con esto hoy más temprano, ¡gracias por la solución! – joemeilinger

2

Este post es viejo, 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:[email protected]:PORT/NAME

Espero que esto ayude a alguien.

13

Tengo este error al intentar ejecutar las pruebas con el conjunto db prueba de este modo:

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

problema es que el objeto sqlite3 DatabaseOperations no tiene el atributo geo_db_type (como el título de este post sugiere)

Mi solución fue cambiar el backend para el sqlite motor SIG equivalente:

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

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

0

me olvidó comentar la configuración 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 se anulan los valores que yo había agregado anteriormente

Cuestiones relacionadas