web-dev-qa-db-ja.com

syncdbを実行しているときに、「DatabaseOperations」オブジェクトを取得しても属性「geo_db_type」エラーがない

HerokuのGeoDjangoアプリでheroku run python manage.py syncdbを実行しようとしていますが、次のエラーが表示されます。

AttributeError: 'DatabaseOperations'オブジェクトに属性 'geo_db_type'がありません

Allofmyresearch は同じ解決策をもたらしました:データベースとしてDjango.contrib.gis.db.backends.postgisを使用するようにしてくださいエンジン。面白いのは、私はすでにこれをやっているということです(そして、Django.contrib.gisにはINSTALLED_APPSもあります):

settings.py

DATABASES = {
  'default': {
    'ENGINE': 'Django.contrib.gis.db.backends.postgis',
    'NAME': '...',
    'Host': '...',
    'PORT': ...,
    'USER': '...',
    'PASSWORD': '...'
  }
}

INSTALLED_APPS = (
    ...,
    'Django.contrib.gis',
)

他に何か足りないものはありますか?どんな助けでも大歓迎です、以下は参考のための完全なエラートレースです:

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'

更新GeoDjangoチュートリアル および Heroku/Djangoチュートリアル に従い、シンプルなアプリを構築しましたそれは私の開発マシンで動作します。 カスタムGeoDjangoビルドパック を使用してHerokuにプッシュし、syncdbを試しましたが、同じエラーが発生しました。これはDjango/GeoDjango、Heroku、またはビルドパックの問題ですか?私の開発環境はPostgreSQL 9.1とPostGIS 2.0を使用していますが、Herokuは9.0.9と1.5を使用していますが、それが問題になる可能性はありますか?

52
Gady

OPはGeoDjangoビルドパックを使用していましたが、誰かが Geoビルドパック およびdj_database_url私のように、settings.py最後の行を忘れないでください:

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

更新

dj_database_url直接サポート PostGIS。データベースURLをpostgisで始まるように変更できる場合、上記のコードの最後の行なしで実行できます。

68
wkschwartz

Test dbを次のように設定してテストを実行しようとすると、このエラーが発生しました。

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

問題は、sqlite3 DatabaseOperationsオブジェクトが属性geo_db_typeを持たないことです(この投稿のタイトルが示唆するように)。

私の解決策は、バックエンドをsqliteに相当するGISエンジンに変更することでした。

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

可能なすべてのバックエンドについては、geodangoのインストールに関するDjangoのドキュメントを参照してください。インストール手順はこちらをご覧ください。 https://docs.djangoproject.com/en/1.9/ref/contrib/gis/ install /#spatial-database

23
bozdoz

私は同じ問題を抱えていて、変更しなければなりませんでした:

'ENGINE': 'Django.db.backends.postgresql_psycopg2',

に:

'ENGINE': 'Django.contrib.gis.db.backends.postgis',
7
supertramp

この投稿は古いですが、この問題に対する私の答えを共有したかっただけです。私はDjデータベースパッケージを使用していますが、PostGISを使用すると接続URLが異なることを知りませんでした。 PostGISの接続文字列はpostgis://USER:PASSWORD@Host:PORT/NAME

これが誰かを助けることを願っています。

6
Mitch W.

助けてくれた

1)'Django.contrib.gis',INSTALLED_APPSに追加します
2)変更

DATABASES = {
'default': {
    'ENGINE': 'Django.db.backends.mysql',

DATABASES = {
'default': {
    'ENGINE': 'Django.contrib.gis.db.backends.mysql', 

Python3で同じエラーが発生しています:

  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'

適切に使用しましたdj-database-urlエンジンを設定しますが、まだエラーが表示されます

Pyで解釈されるため、dbセットアップを出力するためのprintステートメントを追加しました

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

これは、herokuサーバーがDATABASES['default'] 資格情報。エンジンが適切に設定されているようです。

{'NAME': 'name', 'USER': 'usr', 'PASSWORD': 'pw', 'Host': 'herokuec2Host.amazonaws.com', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'Django.contrib.gis.db.backends.postgis'}
1
Sillson

Pythonスタック上のサンプルアプリケーションcedar 14および通常のHerokoビルドパックheroku/pythonをPostGISで使用しており、同じ問題が発生しました。データベース設定が間違ったDBエンジンで上書きされたため、上記のエラーで_heroku run python manage.py migrate_が失敗しました。設定にエンジンを追加しても何も変わりません。調査の結果、Django_heroku.settings(locals())の呼び出しであることがわかりました。変更を元に戻すsettings.pyの場合、最後の行に。

後で行を追加して、このようにエンジンを再度上書きすることで修正しました。

_Django_heroku.settings(locals())
DATABASES['default']['ENGINE'] = 'Django.contrib.gis.db.backends.postgis'
_
1
Marius