我的django + SQLAlchemy应用程序使用cdecimal而不是默认的decimal模块。 我按照SQLAlchemy网站上的说明进行操作:
import sys
import cdecimal
sys.modules["decimal"] = cdecimal
使用前一个stackoverflow thread中的相同内容,我可以将数据添加到数据库中。但是,当我从表中检索条目并查看其值时,返回给我的值的类型实际上是decimal.Decimal
而不是cdecimal.Decimal
。
如何在检索条目时告诉SQLAlchemy给我回cdecimal.Decimal
个对象?
谢谢!
答案 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之前运行。