SQL Алхимия ORM Getter - PullRequest
       14

SQL Алхимия ORM Getter

0 голосов
/ 05 января 2011

Я использую декларативный стиль для сопоставлений Sql Alchemy. В моей таблице есть столбец, в котором будут храниться части объекта в формате JSON. У меня есть хороший метод, отвечающий за создание JSON, и это то, что я хочу сохранить в моей БД.

Я отобразил поле в своем классе в виде столбца и попытался предоставить синоним для него, но обнаружил, что оно вызывается только при использовании кода. ORM никогда не обращается к получателю.

У меня вопрос: как я могу сказать SA, чтобы она получала значение для столбца из метода?

Вот как выглядит мой код:

class JsonProperty(object):
    _value = None

    def __get__(self, instance, owner):
        if instance is None:
            return self

        return self._value

    def __set__(self, instance, value):
        self._value = value

class TableTestParent(Base,object):
    __tablename__ = 'Test'

    id = Column(Integer, primary_key=True)
    age = Column(Integer)
    name = Column(String)
    _model = Column('model',String)

    @synonym_for('_model')
    @property
    def model(self):
        return self._modelToJson()

    def _modelToJson(self):
        dict = {}
        for item in self.__class__.__dict__.iteritems():
            if type(item[1]) is JsonProperty:
                attName = item[0]
                attValue = getattr(self,attName,'')
                dict[attName] = attValue
        return json.dumps(dict)

class TableTest(TableTestParent):
    email = JsonProperty()
    phone = JsonProperty()
    bestTimes = JsonProperty()

obj = TableTest()
obj.email = 'e@mail.com'
obj.name = 'Yeroc'
#save to db

1 Ответ

2 голосов
/ 05 января 2011

На самом деле довольно просто создать такой тип при использовании TypeDecorator: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/types.html#sqlalchemy.types.TypeDecorator

Однако ... если у вас нет ничего, что конкретно зависит от json, я бы рекомендовал использовать PickleType вместо вашего пользовательского типа json: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/types.html#sqlalchemy.types.PickleType

Вот пример того, как заставить работать колонку json:

class JsonType(types.TypeDecorator):
    impl = types.Unicode

    def process_bind_param(self, value, dialect):
        return json.dumps(value)

    def process_result_value(self, value, dialect):
        return json.loads(value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...