Python dicts в sqlalchemy

const move = (from, to, ...a) =>from === to ? a : (a.splice(to, 0, ...a.splice(from, 1)), a);
const moved = move(0, 2, ...['a', 'b', 'c']);
console.log(moved)
30
задан Jonas Byström 4 September 2009 в 10:03
поделиться

2 ответа

Если вам нужно отобразить отношение 1-N и отобразить его как dict , а не list , затем прочтите Коллекции на основе словаря

Но если вы имеете в виду поле , то что вы можете сделать, чтобы иметь поле БД типа string, которое отображается на ваш объект Python. Но для того же объекта python вы предоставляете свойство, которое будет своего рода прокси для этого сопоставленного строкового поля типа dict (). Пример кода (не тестировался):

class MyObject(object):
    # fields (mapped automatically by sqlalchemy using mapper(...)
    MyFieldAsString = None

    def _get_MyFieldAsDict(self):
        if self.MyFieldAsString:
            return eval(self.MyFieldAsString)
        else:
            return {} # be careful with None and empty dict

    def _set_MyFieldAsDict(self, value):
        if value:
            self.MyFieldAsString = str(value)
        else:
            self.MyFieldAsString = None

    MyFieldAsDict = property(_get_MyFieldAsDict, _set_MyFieldAsDict)
3
ответ дан 27 November 2019 в 23:25
поделиться

SQLAlchemy PickleType предназначен именно для этого.

class SomeEntity(Base):
    __tablename__ = 'some_entity'
    id = Column(Integer, primary_key=True)
    attributes = Column(PickleType)

# Just set the attribute to save it
s = SomeEntity(attributes={'baked': 'beans', 'spam': 'ham'})
session.add(s)
session.commit()

# If mutable=True on PickleType (the default) SQLAlchemy automatically
# notices modifications.
s.attributes['parrot'] = 'dead'
session.commit()

Вы можете изменить механизм сериализации, заменив средство выбора другим, имеющим dumps () и загружает () методы. Базовый механизм хранения путем создания подкласса PickleType и переопределения атрибута impl:

class TextPickleType(PickleType):
    impl = Text

import json
class SomeOtherEntity(Base):
    __tablename__ = 'some_other_entity'
    id = Column(Integer, primary_key=True)
    attributes = Column(TextPickleType(pickler=json))
57
ответ дан 27 November 2019 в 23:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: