cdecimal и SQLAlchemy на самом деле хранит десятичные числа.Десятичное число?
Мое приложение django + SQLAlchemy использует cdecimal вместо десятичного модуля по умолчанию.
Я следовал инструкциям на веб-сайте SQLAlchemy:
import sys
import cdecimal
sys.modules["decimal"] = cdecimal
Используя то же самое из предыдущего потока stackoverflow , я могу добавить данные в БД. Однако, когда я извлекаю запись из своей таблицы и смотрю на ее значение, тип возвращаемого мне значения на самом деле decimal.Decimal, а не cdecimal.Decimal.
Как мне сказать SQLAlchemy, чтобы он вернул мне cdecimal.Decimal объекты, когда записи извлекли?
Спасибо!
3 ответов:
SQLAlchemy не имеет возможности загрузить модуль
decimalпосле того, как вы исправили его с помощьюcdecimal. Поэтому в этом случае вам нужно убедиться, что вы делаете sys.изменение модулей перед установкой SQLalhcemy:import sys import cdecimal assert "sqlalchemy" not in sys.modules assert "decimal" not in sys.modules sys.modules["decimal"] = cdecimalEdit: кроме того, убедитесь, что вы делаете
sys.modules["decimal"], чтобы на самом деле настроить замену для "decimal".
Решение здесь заключается в том, чтобы поместить этот код
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 действительно заменяет decimal с самого начала.
Вы можете поменять
decimalнаcdecimalболее надежным способом, заставив его произойти до запуска любого другого кода. При запуске интерпретатор Python будет читать любые.pthфайлы и выполнять любыеimportоператоры, которые они содержат, позволяя нам запускать код до того, как это сделает любая программа. Я более подробно описал своп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, так как у него не будет возможности выполнить предварительную подкачку.
Comments