python - SQLAlchemy select by custom column -
i have sqlalchemy model custom id in uuid format
class email(base): __tablename__ = 'email' id = column(uuid(), primary_key=true, default=uuid.uuid4) raw_email = column(text)
and when try object id
session.query(email).get("0c7a2a97-c93b-4f26-9408-25d2bf597bc0")
it returns error
can't escape uuid binary
i understand problem in custom id because id uuid type, can create preprocessor or similar thing gives me opportunity select objects using str
. because convert str uuid every time need select object annoying
i create own function converting
def str_to_uuid(value): uuid = uuid() return uuid.process_bind_param(value)
and helpful if can decorate id use function.
or it's bad style ?
i understand why have problem this.
class uuid(types.typedecorator): impl = types.largebinary def __init__(self): self.impl.length = 16 types.typedecorator.__init__(self, length=self.impl.length) def process_bind_param(self, value, dialect=none): if value , isinstance(value, uuid.uuid): return value.bytes elif value , isinstance(value, str): return uuid.uuid(value) elif value: raise valueerror('value %s not valid uuid.uuid' % value) else: return none def process_result_value(self, value, dialect=none): if value: return uuid.uuid(bytes=value) else: return none def is_mutable(self): return false
this implementation of uuid column type. , mistake in process_bind_param
. forgot add bytes
elif value , isinstance(value, str): return uuid.uuid(value)
so fix problem when change method to
def process_bind_param(self, value, dialect=none): ... elif value , isinstance(value, str): return uuid.uuid(value).bytes elif value: raise valueerror('value %s not valid uuid.uuid' % value) else: return none
maybe helpful someone.
Comments
Post a Comment