cdecimal和SQLAlchemy实际上存储`decimal.Decimal`?

时间:2012-03-13 18:20:54

标签: python sqlalchemy decimal

我的django + SQLAlchemy应用程序使用cdecimal而不是默认的decimal模块。 我按照SQLAlchemy网站上的说明进行操作:

import sys
import cdecimal
sys.modules["decimal"] = cdecimal 

使用前一个stackoverflow thread中的相同内容,我可以将数据添加到数据库中。但是,当我从表中检索条目并查看其值时,返回给我的值的类型实际上是decimal.Decimal而不是cdecimal.Decimal

如何在检索条目时告诉SQLAlchemy给我回cdecimal.Decimal个对象?

谢谢!

2 个答案:

答案 0 :(得分:3)

这里的解决方案是放置此代码

import sys
import cdecimal
assert "sqlalchemy" not in sys.modules
assert "decimal" not in sys.modules
sys.modules["decimal"] = cdecimal

在manage.py文件中,而不是models.py文件。这可以确保cdecimal实际上从一开始就替换十进制。

答案 1 :(得分:0)

您可以通过在任何其他代码运行之前强制它以更强大的方式交换decimal cdecimal。在启动时,Python解释器将读取任何.pth文件并执行它们包含的任何import语句,允许我们在任何程序执行之前运行代码。我在my blog上更详细地记录了cdecimal交换 - 基本上您需要创建两个文件:

首先site-packages/my_patches.pth包含:

import my_patches

其次site-packages/my_patches.py包含交换代码:

import sys
import cdecimal
# Ensure any import of decimal gets cdecimal instead.
sys.modules['decimal'] = cdecimal

然后你不应该对SQLAlchemy有问题,因为它没有机会在pre-swap之前运行。