gpt4 book ai didi

python - SQLAlchemy:如何在 Python 中以不同于数据库的方式表示数据

转载 作者:太空宇宙 更新时间:2023-11-03 15:18:51 26 4
gpt4 key购买 nike

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

我已经为这些列创建了验证器,它将输入值乘以 100 并在插入和更新时转换为 INT,这样就可以解决这个问题。

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

PS。作为奖励点,我可能还想转换为字符串并添加“$”前缀,所以这个解决方案对我来说非常有用。

最佳答案

我不建议为此使用验证器。相反,我建议使用 TypeDecorator;请参阅this discussion在 SQLAlchemy 文档中。您将为 Price 类型创建一个 TypeDecorator,该类型在绑定(bind)处理时乘以 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 之外的所有内容都是错误的,因为这不会设置声明的列的长度。这应该能让您很好地了解如何组合价格类型。

关于python - SQLAlchemy:如何在 Python 中以不同于数据库的方式表示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43671034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com