本文介绍了使用自定义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实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!