首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Heroku的django-hstore

在Heroku的django-hstore
EN

Stack Overflow用户
提问于 2012-11-05 04:14:57
回答 3查看 777关注 0票数 3

我在Heroku (雪松堆栈)上部署了一个Django (v1.3.3)项目。它使用推荐的dj_database_url来配置settings.DATABASES,一切都很好(到目前为止)。

但是,我想开始对部分应用程序使用django-hstore。根据文档,您必须将settings.py中的数据库引擎更改为:

代码语言:javascript
复制
'ENGINE': 'django_hstore.postgresql_psycopg2',

因此,在我的settings.py文件中,我执行以下操作:

代码语言:javascript
复制
DATABASES = {'default': dj_database_url.config()}
DATABASES['default']['ENGINE'] = 'django_hstore.postgresql_psycopg2'

在当地,一切对我都很好。而且,我的模型具有hstore字段,工作非常好(值是字典)。

但是,当我部署到Heroku时,数据库引擎会被重置/重写为:

代码语言:javascript
复制
ENGINE: 'django.db.backends.postgresql_psycopg2'

为了调试它,我在我的设置文件中设置了引擎后放置了一个打印。然后,我跑bash:

代码语言:javascript
复制
heroku run bash

然后:

代码语言:javascript
复制
python myapp/manage.py shell

当我运行它时,我的print语句向我展示了使用所需的引擎(django_hstore.postgresql_psycopg2)进行的正确(所需的)数据库设置。但是,如果我这样做的话:

代码语言:javascript
复制
from django.conf import settings
print settings.DATABASES

我可以看到数据库引擎不再是django_hstore,而是设置为正常(非hstore)值。如果我导入一个模型并执行get来加载一个对象,那么hstore字段中的值是一个字符串,任何访问键的尝试都会抛出并出错:

代码语言:javascript
复制
TypeError: string indices must be integers, not str

请记住,这个作品是在当地找到的。但是,在部署到heroku之后,任何将值作为字典访问的尝试都会抛出上面的TypeError。

我的问题是:

  • 有人知道为什么我的引擎会被覆盖吗?如果是的话,我该如何解决这个问题?

  • 在Django 1.3.3中使用hstore字段的另一种方法可能不需要更改引擎(因此对Heroku更加友好)
EN

回答 3

Stack Overflow用户

发布于 2013-02-24 03:20:01

SQLAlchemy 0.8包括实用程序方法,这些方法可用于创建一个自定义模型,用于处理Python和Postgres hstore之间的转换。

代码语言:javascript
复制
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编写它们。

我使用内存中的SQLite数据库来运行测试,只要您对非PostgreSQL后端使用text类型,测试就能正常工作:

代码语言:javascript
复制
    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"
票数 2
EN

Stack Overflow用户

发布于 2013-03-15 04:52:21

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

看起来这个包最初是django-hstore的一个分支,包含相同的功能,但是已经被更新为不再需要定制的数据库后端,这样就可以缓解您的问题了。(请注意,其中一些查询语法已经更改)。

作为一种奖励,回购比你链接到的原版django-hstore更新得更近,它已经很多年没碰过了……太可怕了。

票数 1
EN

Stack Overflow用户

发布于 2014-02-28 14:53:38

很高兴告诉您django_hstore的新版本1.2.1已经发布

通过pip进行升级,并检查新的官方django-hstore github存储库:https://github.com/djangonauts/django-hstore

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13225830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档