如何使SQLAlchemy将对象存储为json而不是存储关系?

时间:2018-10-19 23:13:40

标签: python sqlalchemy

我有两个课

class PersonName:
   Salutation: String
   FirstName : String
   LastName : String

class Person:
  id : Integer
  Name : PersonName   
  ...other props...

我不希望为PersonName生成表,我希望SQLAlchemy简单地使用字符串列并将实例序列化为JSON(并在提取实例时反序列化)。我不需要深度查询或其他任何东西,只需要基本的序列化即可。

这可能吗?

1 个答案:

答案 0 :(得分:0)

Here是一个不错的解决方案。

像这样定义类:

class Person(db.Model):
    __tablename__ = 'persons'
    id = db.Column(db.Integer, primary_key=True)
    fancy_name = db.Column(JsonEncodedDict)

并像这样使用它:

person = Person(fancy_name={'Salutation': 'Mr.', 'FirstName': 'Sergey', 'FullMiddleName': 'Vladimirovich'})

要使其正常工作,您需要在某处定义一个自定义JSON类型的装饰器。

import json
from sqlalchemy.ext import mutable

db = SQLAlchemy()

class JsonEncodedDict(db.TypeDecorator):
    """Enables JSON storage by encoding and decoding on the fly."""
    impl = db.Text

    def process_bind_param(self, value, dialect):
        if value is None:
            return '{}'
        else:
            return json.dumps(value)

    def process_result_value(self, value, dialect):
        if value is None:
            return {}
        else:
            return json.loads(value)


mutable.MutableDict.associate_with(JsonEncodedDict)