我有一个问题 - 我为postgresql方言使用自定义JSON类型。 我需要使用postgres / sqlite(postgres for production,sqlite for unit tests作为内存测试数据库)。
from sqlalchemy.dialects.postgresql.json import JSON
class Entity(ModelBase, SAModel):
__tablename__ = 'entities'
id = Column(pkey_type, primary_key=True, nullable=False)
priority = Column(Integer, nullable=False)
tags = Column(JSON, nullable=False, default={})
不幸的是,sqlite不能直接使用JSON。我需要像“SmartJSONType”这样的smth,它将根据当前的sqlalchemy方言切换行为(使用JSON作为本机Postgres JSON数据类型和SQLite中的字符串)。 任何人都可以帮我这个吗?
答案 0 :(得分:2)
你当然可以这样做。有一个complete code example here。
但简化的例子是:
class JSONType(sa.types.TypeDecorator):
impl = sa.UnicodeText
def load_dialect_impl(self, dialect):
if dialect.name == 'postgresql':
return dialect.type_descriptor(JSON())
else:
return dialect.type_descriptor(self.impl)
def process_bind_param(self, value, dialect):
if dialect.name == 'postgresql':
return value
if value is not None:
value = json.dumps(value)
return value
def process_result_value(self, value, dialect):
if dialect.name == 'postgresql':
return value
if value is not None:
value = json.loads(value)
return value
我自己这样做,因为我在内存数据库中的sqlite中运行快速测试,而在我们的实际生产数据库中进行较慢的测试,这是postgres。