L’ottenimento dell’object “DatabaseOperations” non ha alcun errore “geo_db_type” quando si esegue un syncdb

Sto tentando di eseguire heroku run python manage.py syncdb sulla mia app GeoDjango su Heroku, ma ottengo il seguente errore:

AttributeError: l’object ‘DatabaseOperations’ non ha attributo ‘geo_db_type’

Tutte le mie ricerche hanno prodotto la stessa soluzione: assicurati di usare django.contrib.gis.db.backends.postgis come motore del database. La cosa divertente è che lo sto già facendo (e ho anche django.contrib.gis in django.contrib.gis ):

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

C’è qualcos’altro che mi manca? Qualsiasi aiuto è molto apprezzato, di seguito è riportata la traccia di errore completa per riferimento:

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

Aggiornamento : ho seguito il tutorial di GeoDjango e il tutorial di Heroku / Django e ho creato una semplice app che funziona sulla mia macchina di sviluppo. L’ho spinto a Heroku usando un buildpack GeoDjango personalizzato e ho provato syncdb, ma ho ottenuto lo stesso errore. Si tratta di un problema con Django / GeoDjango, Heroku o il buildpack? Il mio ambiente di sviluppo utilizza PostgreSQL 9.1 e PostGIS 2.0, ma Heroku utilizza 9.0.9 e 1.5, potrebbe essere questo il problema?

L’OP stava usando il buildpack GeoDjango, ma nel caso in cui qualcuno arrivi qui usando Geo buildpack e dj_database_url come lo ero io, in settings.py non dimenticare l’ultima riga:

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

Ho ricevuto questo errore quando provavo a eseguire test con il test db set in questo modo:

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

Il problema è che l’object DatabaseOperations sqlite3 non ha l’attributo geo_db_type (come suggerisce il titolo di questo post).

La mia soluzione era di cambiare il back-end al motore GIS equivalente sqlite:

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

Vedere i documenti di django sull’installazione di geodjango per tutti i possibili backend, con le istruzioni di installazione: https://docs.djangoproject.com/en/1.9/ref/contrib/gis/install/#spatial-database

Questo post è vecchio ma volevo solo condividere la mia risposta a questo problema. Sto usando il pacchetto Dj Database e non sapevo che l’URL della connessione fosse diverso quando si utilizza PostGIS. La stringa di connessione per PostGIS è postgis://USER:[email protected]:PORT/NAME

Spero che questo aiuti qualcuno.

In python3 sto ottenendo lo stesso errore:

  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' 

Ho usato correttamente dj-database-url per impostare il motore, tuttavia sto ancora vedendo l’errore

Ho aggiunto una dichiarazione di stampa per l’output dei miei setup db mentre vengono interpretati da py

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

Ecco la dichiarazione di stampa che mostra ciò che il server heroku sta interpretando come credenziali DATABASES['default'] . Sembra che il motore sia stato impostato correttamente.

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

Il buildpack è stato il colpevole principale qui. Invece di usare il buildpack GeoDjango elencato nella pagina del buildpack di Heroku , ho usato una delle sue forcelle che è stata aggiornata più di recente.

Inoltre, quando git push heroku master un git push heroku master , Heroku crea un database di sviluppo per l’app, e quando eseguo un syncdb, l’impostazione DATABASES viene ignorata e Heroku prova a utilizzare il database di sviluppo invece … ovviamente un problema, perché dev i database non possono / non possono avere PostGIS installato. Così ho distrutto il database dev dopo che è stato creato con git push (con il buildpack corretto ), quindi è stato eseguito syncdb e funziona.

Ho dimenticato di commentare le impostazioni db più in basso in 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) 

Queste righe stavano ignorando le impostazioni che avevo aggiunto sopra