我正在使用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指定自定义编码器?
通过的json_serializer关键字参数支持此功能create_engine,如下面所述sqlalchemy.dialects.postgresql.JSON:
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)