在(postgres)SQLAlchemy模型/类中,我有几个列是' price'列。我已经读过,对于这种数据使用数字/货币/浮点类型并不是一个好主意,因此我将其存储为INT(便士)。
我为这些列创建了验证器,它们将输入值乘以100并在插入和更新时强制转换为INT,以便处理。
我该如何反过来?当我选择这些数据时,我想将这些值转换为浮点数然后除以100.我似乎找不到合适的sqlalchemy事件监听器来执行此操作。有没有正确的方法呢?
PS。作为奖励积分,我可能还想投射到字符串并添加' $'前缀,所以这个解决方案对我来说非常有用。
答案 0 :(得分:1)
我不建议使用验证器。相反,我建议使用TypeDecorator;请参阅SQLAlchemy文档中的this discussion。您将为Price类型创建一个TypeDecorator,它在绑定处理时乘以100并除以行处理。 这是一个简单的例子,它从我的一些代码中处理uuid类型:
from sqlalchemy.types import TypeDecorator, CHAR
import uuid
class GUID(TypeDecorator):
# Also see:
# http://docs.sqlalchemy.org/en/latest/core/custom_types.html#backend-agnostic-guid-type
impl = CHAR
def process_bind_param(self, value, dialect):
if value is None:
return value
else:
if not isinstance(value, uuid.UUID):
return uuid.UUID(value).hex
else:
return value.hex
def process_result_value(self, value, dialect):
if value is None:
return value
else:
return uuid.UUID(value)
将impl设置为char对于除sqlite之外的所有内容都是错误的,因为它不会设置声明的列的长度。 这应该会让你知道如何整理价格类型。