Синоним столбца SQLAlchemy с другим типом - PullRequest
5 голосов
/ 03 февраля 2012

Я использую рецепт SQLAlchemy здесь для магического JSON-кодирования / декодирования столбца из БД в моей модели, например:

class Thing(Base):
    __tablename__ = 'things'
    id = Column(Integer(), primary_key=True)
    data = Column(JSONEncodedDict)

Я столкнулся с проблемой, когда захотел создать в моей модели дополнительное поле «raw_data» для доступа к тем же базовым данным JSON, но без кодирования / декодирования:

    raw_data = Column("data", VARCHAR)

SQLAlchemy, похоже, смущается конфликтом имен и оставляет один столбец не отображенным. Можно ли как-то убедить SQLAlchemy сопоставить оба атрибута одному столбцу?

1 Ответ

3 голосов
/ 03 февраля 2012

Я бы просто определил столбец raw_data через SQLAlchemy, а затем использовал бы свойство / установщик Python для прозрачного использования data. I.e.:

class Thing(Base):
    __tablename__ = 'things'
    id = Column(Integer(), primary_key=True)
    raw_data = Column(String())

    @property
    def data(self):
        # add some checking here too
        return json.loads(self.raw_data)

    @data.setter
    def data(self, value):
        # dito
        self.raw_data = json.dumps(value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...