Лучшие практики для ведения бухгалтерского учета в Python - PullRequest
5 голосов
/ 29 июля 2010

Я пишу приложение web2py, которое требует суммирования в долларах без потери точности.Я понимаю, что для этого мне нужно использовать десятичные дроби, но я обнаружил, что должен обернуть каждое число, полученное из базы данных:

Decimal(str(myval))

Прежде чем сойти с ума, добавив, чтоко всему моему коду, есть ли лучший способ?Я новичок в Python, поэтому вполне возможно, что я пропускаю что-то очевидное.

Редактировать : моя база данных - MS SQL Server, и я храню суммы в SQL Server money поля (я считаю, что реализация аналогична десятичной, то есть целочисленная математика, а не с плавающей запятой).

Я подключаюсь к БД через каркас web2py (который использует pyodbc для соединений с SQL Server).Я считаю, что web2py имеет некоторую поддержку десятичных типов.Например, мои определения полей web2py выглядят так: Field('Amount','decimal(19,4)') Однако, когда я возвращаю значение из базы данных, используя метод .executesql web2py, он возвращает значение как float, а не Decimal.

Редактировать : Это похоже на проблему с FreeTDS и MS SQL Server.Как сказал Массимо в комментариях, web2py правильно поддерживает это и возвращает десятичное число (если может).Оказывается, это только проблема в моей производственной среде (Linux).Я использую драйвер FreeTDS для подключения к MS SQL, и он, похоже, переводит денежный тип MS SQL в число с плавающей точкой.

Я думаю, что ответ Алекса Мартелли указывает в правильном направлении.У кого-нибудь есть опыт работы с FreeTDS, MS SQL и python?Я думаю, что это, вероятно, требует своего собственного вопроса, поэтому я перенесу это обсуждение ... (новый вопрос размещен здесь: FreeTDS переводит денежный тип MS SQL в число с плавающей запятой, а не десятичное число )

Обновление : На самом деле во FreeTDS была ошибка.Это было исправлено в заголовке CVS FreeTDS от 4 августа 2010 года.

Ответы [ 2 ]

8 голосов
/ 29 июля 2010

Во-первых, сохраняйте все числа в десятичной форме в базе данных - вы не упоминаете, какой механизм БД вы используете, но каждый механизм поддерживает такую ​​функцию, например, здесь - это MySQL DECIMAL тип документации Я надеюсь, что вы уже делаете это, но, если вы этого не сделаете, это все еще стоит боли изменения схемы.

Затем необходимо убедиться, что преобразование типов в и из БД соответствует десятичным числам в базе данных и Python. К сожалению, не существует стандартного способа сделать это в реализациях DB-API, но большинство из них предлагают способ; например, в MySQLDB вам нужно передать параметр conv= в connect, известный как «словарь преобразователей типов» - по умолчанию это копия MySQLdb.converters.conversions, но, конечно, вы можете обогатить его, чтобы делать правильные вещи с десятичной дробью. Если вы сообщите нам, какую БД вы используете, и какой пакет соединителя DB-API вы предпочитаете, мы сможем оказать вам более подробную помощь по этому вопросу.

Редактировать : @unutbu отмечает в комментарии, что текущий конвертер MySQLdb уже правильно переводит десятичные дроби, поэтому, если вы не застряли с очень старым выпуском MySQLdb, у вас все будет хорошо, пока Вы правильно сохраняете все числа как десятичные в БД (ууу!).

0 голосов
/ 29 июля 2010

Вы можете написать функцию, которая будет получать число из базы данных и затем преобразовывать его в десятичную. Тогда просто используйте это в своем коде.

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