SQLAlchemy:如何用不同于数据库

时间:2017-04-28 02:33:39

标签: python sqlalchemy psycopg2

在(postgres)SQLAlchemy模型/类中,我有几个列是' price'列。我已经读过,对于这种数据使用数字/货币/浮点类型并不是一个好主意,因此我将其存储为INT(便士)。

我为这些列创建了验证器,它们将输入值乘以100并在插入和更新时强制转换为INT,以便处理。

我该如何反过来?当我选择这些数据时,我想将这些值转换为浮点数然后除以100.我似乎找不到合适的sqlalchemy事件监听器来执行此操作。有没有正确的方法呢?

PS。作为奖励积分,我可能还想投射到字符串并添加' $'前缀,所以这个解决方案对我来说非常有用。

1 个答案:

答案 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之外的所有内容都是错误的,因为它不会设置声明的列的长度。 这应该会让你知道如何整理价格类型。