Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使SQLAlchemy将对象存储为json而不是关系?_Python_Sqlalchemy - Fatal编程技术网

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

Python 如何使SQLAlchemy将对象存储为json而不是关系?,python,sqlalchemy,Python,Sqlalchemy,我有两节课 class PersonName: Salutation: String FirstName : String LastName : String 及 我不想为PersonName生成一个表,而是希望SQLAlchemy简单地使用一个字符串列并将实例序列化为JSON(并在获取实例时反序列化)。我不需要深入的查询或任何东西,只需要基本的序列化 这可能吗?是一个很好的解决方案 如下定义类: 班级人员(数据库模型): __tablename_uuu='persons'

我有两节课

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

我不想为
PersonName
生成一个表,而是希望SQLAlchemy简单地使用一个字符串列并将实例序列化为JSON(并在获取实例时反序列化)。我不需要深入的查询或任何东西,只需要基本的序列化

这可能吗?

是一个很好的解决方案

如下定义类:

班级人员(数据库模型):
__tablename_uuu='persons'
id=db.Column(db.Integer,主键=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)

您使用的是什么数据库管理系统?有些本地支持JSON。不过,您当前的方法没有问题。请参阅@IljaEverilä在我的案例中,我使用的是sql server,正如我在问题中所说,我想序列化为字符串(比如说
NVarchar
列)。Sql server没有实际的json类型,但如果您将json存储在列中,它会为它提供查询扩展。不管怎样,这都不是我需要数据库支持的事情,我永远不会查询名字或称呼。这是我所需要的ORM支持,我认为这将对您有所帮助:
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)