一尘不染

sqlalchemy中的Python字典

sql

我想从我的sqlite数据库中加载/保存字典,但是在寻找一种简单的方法时遇到了一些问题。我真的不需要根据内容进行过滤等,因此简单地转换为字符串/从字符串转换就可以了。

第二好的是外键。请不要发布指向大量示例的链接,如果我将目光投向任何此类示例,我的头都会爆炸。


阅读 180

收藏
2021-03-17

共1个答案

一尘不染

您可以通过子类sqlalchemy.types.TypeDecorator化来创建自定义类型,以处理对Text的序列化和反序列化。

一个实现可能看起来像

import json
import sqlalchemy
from sqlalchemy.types import TypeDecorator

SIZE = 256

class TextPickleType(TypeDecorator):

    impl = sqlalchemy.Text(SIZE)

    def process_bind_param(self, value, dialect):
        if value is not None:
            value = json.dumps(value)

        return value

    def process_result_value(self, value, dialect):
        if value is not None:
            value = json.loads(value)
        return value

用法示例:

class SomeModel(Base):
    __tablename__ = 'the_table'
    id = Column(Integer, primary_key=True)
    json_field = Column(TextPickleType())

s = SomeModel(json_field={'baked': 'beans', 'spam': 'ham'})
session.add(s)
session.commit()

在SQLAlchemy文档的一个示例中进行了概述,该示例还显示了如何跟踪该词典的变异。

这种方法应该适用于所有版本的Python,但是正如AlexGr枚nholm在他对另一个答案的评论中指出的那样,仅将json值作为pickler参数传递给PickleType不会正确地起作用

2021-03-17