2012-11-05 6 views
3

나는 Heroku (cedar stack)에 배치 된 장고 (v 1.3.3) 프로젝트를 가지고 있습니다. 설정을 구성하는 데 권장되는 dj_database_url을 사용합니다. 데이터베이스. 모든 것이 훌륭합니다 (이 시점까지).django-hstore on Heroku

그러나 응용 프로그램의 일부로 django-hstore을 사용하고 싶습니다. 워드 프로세서에 따르면, 당신이 settings.py에서 데이터베이스 엔진을 변경해야합니다 : 내 settings.py 파일에서 결과

'ENGINE': 'django_hstore.postgresql_psycopg2', 

, 나는 다음을 수행하십시오

DATABASES = {'default': dj_database_url.config()} 
DATABASES['default']['ENGINE'] = 'django_hstore.postgresql_psycopg2' 

모든 작업을 내게 국지적으로 좋네. 그리고 hstore 필드가있는 모델은 훌륭하게 작동합니다 (값은 사전입니다).

는 그러나, 나는에게 Heroku에 배포 할 때, 데이터베이스 엔진에 오버라이드 (override)/리셋됩니다 : 그것을 디버깅에서 시도에서

ENGINE: 'django.db.backends.postgresql_psycopg2' 

, 내 설정 파일에서 엔진을 설정 한 후 인쇄를 뒀다. 다음

heroku run bash 

과 : :이 프로그램을 실행할 때

python myapp/manage.py shell 

, 내 인쇄 문이 나에게 원하는 엔진 (django_hstore.postgresql_psycopg2)와 올바른 (원하는) 데이터베이스 설정을 보여줍니다 다음, 나는 떠들썩한 파티를 실행합니다. 그러나, 나는 다음 할 경우 :

from django.conf import settings 
print settings.DATABASES 

나는 데이터베이스 엔진이 더 이상 django_hstore이지만, 다시 정상 (비 hstore) 값으로 설정 볼 수 있습니다. 마음에

TypeError: string indices must be integers, not str 

보관하십시오 : 내 모델 중 하나를 가져 객체를로드하는 GET을 할 경우 그리고, hstore 필드의 값은 문자열, 그리고 던질 것입니다 키에 액세스하려는 시도와 오류입니다 이것이 로컬에서 작동한다는 것입니다. 그러나 heroku에 배포 한 후 사전으로 값에 액세스하려는 시도는 위의 TypeError를 throw합니다.

내 질문은 : 내 엔진이 겹쳐지고 이유

  • 사람이 알고 있나요? 그렇다면 어떻게 해결할 수 있습니까?

또는

엔진을 변경 (따라서 좀 더 Heroku가 친절)하는 데 필요하지 않을 수도 장고 1.3.3로 hstore 필드를 사용하는 또 다른 방법이 있나요
+0

당신이 운동을 어떻게 끝났는가를? 나는 HStore w/Django & Heroku를보고 있으며,이 함정에 조심하기 전에주의해야한다. –

답변

2

SQLAlchemy 0.8은 파이썬 dict과 포스트 그레스 hstore 사이의 변환을 처리하기 위해 custom model을 생성하는 데 사용할 수있는 유틸리티 메소드를 포함합니다.

from django.db import models 
from sqlalchemy.dialects.postgresql.hstore import _parse_hstore, _serialize_hstore 

class HStoreField (models.TextField): 
    __metaclass__ = models.SubfieldBase 

    def __init__(self, *args, **kwargs): 
     super(HStoreField, self).__init__(*args, **kwargs) 

    def to_python(self, value): 
     if value is None: 
      return None 
     if isinstance(value, dict): 
      return value 
     return _parse_hstore(value) 

    def get_db_prep_save(self, value, connection): 
     if value is None: 
      return None 
     if isinstance(value, str): 
      return value 
     return _serialize_hstore(value) 

    def db_type (self, connection): 
     return "hstore" 

이 모델은 이식 가능하지만 hstore 키 또는 값을 기반으로 쿼리를 실행하려면 원시 SQL로 작성해야합니다.이 패키지처럼

def db_type (self, connection): 
     from django.db import connection 
     if connection.settings_dict['ENGINE'] == \ 
      'django.db.backends.postgresql_psycopg2': 
      return "hstore" 
     else: 
      return "text" 
+0

그게 무슨 가치가있어 내가 장고 1.5에서 이것에 대한 변형을 사용하고 있으며 그것은 작동하는 것으로 보입니다. 남한과 원활하게 일할 수 있도록 주문을 추가해야했습니다. – pdc

1

https://github.com/niwibe/djorm-ext-hstore

가 보이는 :

나는만큼 당신이 아닌 PostgreSQL의 백엔드에 대한 text 유형을 사용할 때 잘 작동 실행 테스트에 대한 SQLite는 메모리 데이터베이스를 사용 원래 django-hstore 포크와 동일한 기능을 포함하지만 더 이상 사용자의 데이터베이스 백엔드가 문제를 완화하는 것처럼 보일 필요가 없도록 업데이트되었습니다. 일부 쿼리 구문이 변경되었습니다.

보너스로, repo는 귀하가 연결 한 original django-hstore보다 훨씬 최근에 유지됩니다.이 링크는 몇 년 동안 만져 본 적이 없지만 무서운 것입니다.

+0

사실입니다. djorm-ext-hstore가 활성화되어있는 동안 django-hstore는 더 이상 유지 보수되지 않는 것처럼 보입니다. – chhantyal

1

행복은 주사위를 통해 django_hstore의 새 버전 1.2.1

업그레이드 밖으로 당신에게 말해 새로운 공식 장고 - hstore의 GitHub의 저장소 확인 : https://github.com/djangonauts/django-hstore