cdecimal и SQLAlchemy на самом деле хранит десятичные числа.Десятичное число?



Мое приложение django + SQLAlchemy использует cdecimal вместо десятичного модуля по умолчанию.
Я следовал инструкциям на веб-сайте SQLAlchemy:



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


Используя то же самое из предыдущего потока stackoverflow , я могу добавить данные в БД. Однако, когда я извлекаю запись из своей таблицы и смотрю на ее значение, тип возвращаемого мне значения на самом деле decimal.Decimal, а не cdecimal.Decimal.



Как мне сказать SQLAlchemy, чтобы он вернул мне cdecimal.Decimal объекты, когда записи извлекли?



Спасибо!

615   3  

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"] = cdecimal

Edit: кроме того, убедитесь, что вы делаете 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

    Ничего не найдено.