2012-09-21 36 views
34

Tôi đang cố gắng để chạy heroku run python manage.py syncdb trên ứng dụng GeoDjango tôi trên Heroku, nhưng tôi nhận được lỗi sau:Bắt đối tượng 'DatabaseOperations' không có thuộc tính lỗi 'geo_db_type' khi làm một syncdb

AttributeError: 'DatabaseOperations' đối tượng không có thuộc tính 'geo_db_type'

Allofmyresearch đã mang lại cùng một giải pháp: hãy chắc chắn để sử dụng django.contrib.gis.db.backends.postgis như cơ sở dữ liệu. Điều buồn cười là Tôi đã làm điều này (và tôi cũng có django.contrib.gis trong INSTALLED_APPS):

settings.py 

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

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

Có cái gì khác tôi đang thiếu? Any help is appreciated rất nhiều, dưới đây là dấu vết lỗi đầy đủ để tham khảo:

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' 

Cập nhật: Tôi làm theo các GeoDjango tutorialHeroku/Django tutorial, và xây dựng một ứng dụng đơn giản mà làm việc trên máy dev của tôi. Tôi đã đẩy nó vào Heroku bằng cách sử dụng một custom GeoDjango buildpack và đã thử syncdb, nhưng nhận được cùng một lỗi. Đây có phải là vấn đề với Django/GeoDjango, Heroku hoặc buildpack không? Môi trường dev của tôi đang sử dụng PostgreSQL 9.1 và PostGIS 2.0, nhưng Heroku sử dụng 9.0.9 và 1.5, đó có phải là vấn đề không?

Trả lời

-1

Trình xây dựng là thủ phạm chính ở đây. Thay vì sử dụng gói dựng GeoDjango được liệt kê trên Heroku's buildpack page, tôi đã sử dụng one of it's forks đã được cập nhật gần đây hơn.

Ngoài ra, khi tôi làm một git push heroku master, Heroku tạo ra một cơ sở dữ liệu dev cho các ứng dụng, và khi tôi làm một syncdb, thiết lập DATABASES của tôi là bỏ qua và Heroku cố gắng sử dụng cơ sở dữ liệu dev thay vì ... rõ ràng là một vấn đề, bởi vì cơ sở dữ liệu dev không/không thể cài đặt PostGIS. Vì vậy, tôi đã phá hủy cơ sở dữ liệu dev sau khi nó được tạo ra với git push (với correct buildpack), sau đó chạy syncdb và nó hoạt động.

+0

tôi vẫn gặp lỗi này sau khi sử dụng gói xây dựng tùy chỉnh. – limovala

+6

Trong khi câu hỏi là Heroku cụ thể, tiêu đề là khá chung chung. Vấn đề cũng có thể phát sinh nếu Django DATABASES ENGINE không được đặt thành django.contrib.gis.db.backends.postgis –

42

Các OP đã sử dụng buildpack GeoDjango, nhưng trong trường hợp bất cứ ai được ở đây sử dụng Geo buildpackdj_database_url như tôi là, trong settings.py đừng quên dòng cuối cùng:

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

cảm ơn! điều này làm việc hoàn hảo cho tôi – frankV

+1

chạy vào điều này trước đó ngày hôm nay, cảm ơn cho việc sửa chữa! – joemeilinger

2

bài này là cũ nhưng Tôi chỉ muốn chia sẻ câu trả lời của tôi cho vấn đề này. Tôi đang sử dụng gói Cơ sở dữ liệu Dj và tôi không biết rằng URL kết nối khác nhau khi sử dụng PostGIS. Chuỗi kết nối cho PostGIS là postgis://USER:[email protected]:PORT/NAME

Hy vọng điều này sẽ giúp ai đó.

13

tôi đã nhận lỗi này khi cố gắng chạy thử nghiệm với db tập kiểm tra như sau:

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

Vấn đề là rằng đối tượng sqlite3 DatabaseOperations không có thuộc tính geo_db_type (như tiêu đề của bài này gợi ý).

Giải pháp của tôi đã thay đổi phụ trợ để động cơ sqlite tương đương GIS:

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

Xem các tài liệu django trên cài đặt geodjango cho tất cả các phần phụ trợ có thể, với các hướng dẫn cài đặt: https://docs.djangoproject.com/en/1.9/ref/contrib/gis/install/#spatial-database

0

tôi quên nhận xét các cài đặt db tiếp tục xuống trong 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) 

Những dòng này ghi đè cài đặt mà tôi đã thêm ở trên

Các vấn đề liên quan