14 июня 2016 г. 17:55

171

Postgresql Hstore

Ранее я описал , как можно создавать динамические поля для продуктов, используя для этого паттерн EAV и решение с использованием MongoDb. Есть еще один способ с использованием расширения HSTORE для Postgresql.

Hstore - это расширение для PostgreSQl , который позволяет хранить данные в вида ключ - значение. То есть мы в одном поле можем хранить хеш в виде ключ и значение. Это лучше , чем хранить в текстовом поле сериализованный хэш , потому что Postgres позволяет создавать индексы на ключах нашего хэша. Подробнее об этом вы можете почитать здесь.

Создадим простой проект с продуктами , которые могут иметь произвольное количество полей. Для этого мы будем использовать django и замечательное расширение django-hstore.

Как устанавливать django я не буду здесь приводит.Вы можете это сделать посетив официальный сайт https://www.djangoproject.com/

Создаем новый проект

 django-admin.py startproject shop_hstore<br>

Теперь мы создадим новое приложения под названием catalog

manage.py startapp catalog

До того пока мы не создали модели в приложении каталог , мы установим расширение django-hstore,

Устанавливаем django-hstore

pip install django-hstore

Теперь мы должны добавить django-store в INSTALLED_APPS в файле settings.py. Заодно мы добавим туда наше приложение catalog

INSTALLED_APPS = (
    ...
    "django_hstore",
    "catalog",
)

Кстати , дополнительные сведения по установке и по самому расширению вы можете посмотреть тут

Теперь настроим нашу базу данных. Так как мы используем POSTGRESQL , то мы должны активировать модуль hstore.

После того как мы активировали этот модуль , то теперь в файле settings.py настроим соединение:

DATABASES = { 
   'default': {    
       'ENGINE': 'django.db.backends.postgresql_psycopg2',      
       'NAME': 'shop',    
       'USER': 'postgres',     
       'PASSWORD': 'postgres',      
       'HOST': '', 
       'PORT': '',
   }

Теперь создаем модель Product в файле catalog/models.py

from django.db import models
from django_hstore import hstore
class Product(models.Model):
    title = models.CharField(max_length=150)
    price = models.DecimalField(max_digits=7,decimal_places=2)
    attribute_data = hstore.DictionaryField()
    objects = hstore.HStoreManager()
    def __unicode__(self):
        return self.title

Здесь мы создали поле title и price и добавили поле attribute_data, который является key-value хранилищем , то есть поле hstore.

comments powered by Disqus