I'm working with a IBM DB2 database using ibm_db2 driver and sqlalchemy. My model is:
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))
String fields from the database (e.g. name) comes in the form of:
>>> "John "
, where the value is filled right with blanks to the full length of the field by schema.
I need to change this behavior to the sqlalchemy type String (or a derivative thereof) produced follow (e.g. value.strip()) before output results by query.all():
>>> "John"
How can I do this?
@property decorator is not applicable. I need to change the behavior of a standard sqlalchemy String class.
I would not want to change the behaviour of the standard String but to make a new type (you can then rename it to String per module basis or whatever) but it is cleanest that way:
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)
Now you can use StrippedString
instead of String
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With