2013-08-24 57 views
2

我正在使用IBM DB2数据库,使用ibm_db2驱动程序和sqlalchemy。 我的模式是:从数据库(例如SQLAlchemy列结果处理

class User(Model): 
    id   = Column('UID', Integer, primary_key=True) 
    user  = Column('USER', String(20)) 
    password = Column('PASSWORD', String(10)) 
    name  = Column('NAME', String(30)) 

字符串字段进来的形式:

>>> "John        " 

,其中值是正确的用空格填充的全长模式领域。

我需要改变这个行为和SQLAlchemy的类型字符串(或其衍生物)所产生的后续(例如value.strip())由query.all输出结果()之前

>>> "John" 

我该怎么做?

@特性装饰者不适用。我需要改变一个标准的sqlalchemy String类的行为。

+1

您是通过SQLAlchemy还是通过手动创建此表?似乎你有一个CHAR列而不是VARCHAR? –

回答

4

我不想改变标准字符串的行为,但做出一个新的类型(那么你可以将其重命名为每个模块的基础上或任何字符串),但它是干净的那样:

from sqlalchemy import types 

class StrippedString(types.TypeDecorator): 
    ''' 
    Returns CHAR values with spaces stripped 
    ''' 

    impl = types.String 

    def process_bind_param(self, value, dialect): 
     "No-op" 
     return value 

    def process_result_value(self, value, dialect): 
     "Strip the trailing spaces on resulting values" 
     return value.rstrip() 

    def copy(self): 
     "Make a copy of this type" 
     return StrippedString(self.impl.length) 

现在您可以使用StrippedString而不是String

+0

我很肯定你不需要实现nop函数:默认会处理它们。 – javex

+0

真的,从sa文档复制并认为我保持完整性 –

+0

谢谢SOOO很多!这正是我需要的!你太棒了!!!谢谢!!! – yokotoka