SQLAlchemy HSTORE列不覆盖数据库默认值

时间:2014-01-04 02:28:06

标签: postgresql sqlalchemy hstore

鉴于我创建了一个像这样的数据库

  • createuser -s test
  • createdb test -O test
  • psql test -c "create extension hstore; create table data_table(id int, data hstore)"

鉴于我有以下代码

from __future__ import unicode_literals

from sqlalchemy import Table, Integer, create_engine, MetaData, Column
from sqlalchemy.dialects.postgresql import HSTORE as _HSTORE
from sqlalchemy.ext.mutable import MutableDict


metadata = MetaData()


class HSTORE(_HSTORE):

    def result_processor(self, dialect, coltype):
        processor = super(HSTORE, self).result_processor(dialect, coltype)
        def process(value):
            return processor(value) or {}  # force a default
        return process


engine = create_engine('postgresql://test:test@localhost/test')


data_table = Table('data_table', metadata,
    Column('id', Integer, primary_key=True),
    Column('data', HSTORE)
)

with engine.connect() as conn:
    conn.execute(
        data_table.insert(),
        data = None
    )

    _, data = conn.execute(data_table.select()).fetchone()

assert data is not None

我希望调用HSTORE.result_processor方法并应用默认值,即值为None。但是,它似乎永远不会发生,并且assert语句引发异常。如何拦截数据库中的值并将其调整为我想要的值?

这是使用python 2.7,postgres 9.3和SQLAlchemy 8.4和9.0。

1 个答案:

答案 0 :(得分:4)

Bah,在更好的Google搜索找到a correct implementation之后不久。

显然我应该使用TypeDecorator而不是尝试直接在类型上执行此操作(这就是为什么仍然逃避我的原因)。

from sqlalchemy.dialects.postgresql import HSTORE as _HSTORE

class HSTORE(types.TypeDecorator):

    impl = _HSTORE

    def process_result_value(self, value, dialect):
        return value or {}

按预期工作。