Python SQLAlchemy列结果处理

Python SQLAlchemy列结果处理,python,sqlalchemy,db2,field,Python,Sqlalchemy,Db2,Field,我正在使用IBM_DB2驱动程序和sqlalchemy使用IBM DB2数据库。 我的模型是: class User(Model): id = Column('UID', Integer, primary_key=True) user = Column('USER', String(20)) password = Column('PASSWORD', String(10)) name = Column('NAME

我正在使用IBM_DB2驱动程序和sqlalchemy使用IBM DB2数据库。 我的模型是:

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                                "
,其中该值由空格填充,按模式填充到字段的全长

在通过query.all()输出结果之前,我需要将此行为更改为follow(例如value.strip())生成的sqlalchemy类型字符串(或其派生字符串):

>>> "John"
我该怎么做


@属性装饰器不适用。我需要更改标准sqlalchemy字符串类的行为。

我不想更改标准字符串的行为,而是要创建一个新类型(然后可以将其重命名为基于模块的字符串或其他类型),但这样做最干净:

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.
        If value is false, we return it as-is; it might be none
        for nullable columns
        """
        return value.rstrip() if value else value

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

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

您是用SQLAlchemy还是手工创建此表的?似乎您有一个CHAR列而不是VARCHAR?我想知道,为什么您需要这样做?当前的行为有什么问题?对于这种行为的干扰/结果是什么?我非常确定您不需要实现nop函数:默认值将处理它们。是的,从sa文档复制而来,并认为我保留它是为了完整性。非常感谢!这正是我需要的!你太棒了!!!非常感谢。这将与可为空的字符列中断('NoneType'对象没有属性'rstrip')。我使用了
返回值.rstrip()if value else value
,因为最大化值是一件好事。