即时更改SQLAlchemy模型列类型

时间:2014-05-16 20:59:03

标签: python json sqlite postgresql sqlalchemy

我有一个问题 - 我为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中的字符串)。 任何人都可以帮我这个吗?

1 个答案:

答案 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。