定义JSON编码器进行SQLAlchemy的PostgreSQL

定义JSON编码器进行SQLAlchemy的PostgreSQL

本文介绍了使用自定义JSON编码器进行SQLAlchemy的PostgreSQL JSONB实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用SQLAlchemy的核心库来访问某些PostgreSQL数据库。考虑我有下表:

I am using SQLAlchemy's core library to access some PostgreSQL database. Consider I have the following table:

create table foo (j jsonb);

以及以下python代码:

And the following python code:

from decimal import *
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, DateTime
from sqlalchemy.dialects.postgresql import JSONB
metadata = MetaData(schema="public")
foo = Table('foo', metadata,Column('f', JSONB))
d = Decimal(2)
ins = foo.insert().values(j = {'d': d})
# assuming engine is a valid sqlalchemy's connection
engine.execute(ins)

最后一句失败,并出现以下错误:

This last sentence fails with the following error:

StatementError("(builtins.TypeError) Decimal('2') is not JSON serializable",)

这就是为什么我问这个问题:有没有一种方法可以为将JSON数据编码到PostgreSQL方言中的SQLAchemy指定自定义编码器?

Which is why I am asking this question: Is there a way to specify a custom encoder for SQLAchemy to use when encoding json data into PostgreSQL dialect?

推荐答案

通过 json_serializer 关键字参数 create_engine ,如:

This is supported via the json_serializer keyword argument to create_engine, as documented under sqlalchemy.dialects.postgresql.JSON:

def _default(val):
    if isinstance(val, Decimal):
        return str(val)
    raise TypeError()

def dumps(d):
    return json.dumps(d, default=_default)

engine = create_engine(..., json_serializer=dumps)

这篇关于使用自定义JSON编码器进行SQLAlchemy的PostgreSQL JSONB实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 09:43