【问题标题】:How to make SQLAlchemy store an object as json instead of a relationship?如何让 SQLAlchemy 将对象存储为 json 而不是关系?
【发布时间】:2018-10-19 23:13:39
【问题描述】:

我有两节课

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

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

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

这可能吗?

【问题讨论】:

  • 您使用的是什么 DBMS?有些原生支持 JSON。不过,您当前的方法没有问题。
  • @IljaEverilä 在我的情况下,我使用的是 sql server,正如我在我想序列化为字符串的问题中所说的那样(所以可以说是 NVarchar 列)。 Sql server 没有实际的 json 类型,但如果你将 json 存储在列中,它就有查询扩展。无论哪种方式,这不是我需要数据库支持的东西,我永远不会查询名字或称呼。这是我只需要 ORM 支持的东西
  • 那我觉得这对你有帮助:docs.sqlalchemy.org/en/latest/core/…

标签: python sqlalchemy


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 2023-03-21
    • 2014-03-07
    • 2014-03-27
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多