鉴于我创建了一个像这样的数据库
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。
答案 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 {}
按预期工作。