cdecimal и SQLAlchemy на самом деле хранят `decimal.Decimal`? - PullRequest
4 голосов
/ 13 марта 2012

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

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

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

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

Решение здесь состоит в том, чтобы поставить этот код

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 действительно заменяет десятичную с самого начала.

3 голосов
/ 14 марта 2012

SQLAlchemy не имеет возможности загрузить модуль decimal, как только вы исправили его с помощью cdecimal. Поэтому в этом случае перед установкой SQLalhcemy необходимо убедиться, что вы вносите изменения в sys.modules:

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

Редактировать: также убедитесь, что вы делаете sys.modules["decimal"], чтобы фактически установить замену для "десятичного числа".

0 голосов
/ 06 июня 2015

Вы можете поменять 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, так как у него не будет возможности запустить предварительный обмен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...