小编典典

使用自定义JSON编码器进行SQLAlchemy的PostgreSQL JSONB实现

python

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

create table foo (j jsonb);

和以下python代码:

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)

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

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

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


阅读 212

收藏
2021-01-16

共1个答案

小编典典

通过的json_serializer关键字参数支持此功能create_engine,如下面所述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)
2021-01-16