在Python中进行会计的最佳实践

时间:2010-07-29 16:16:29

标签: python decimal currency accounting freetds

我正在编写一个web2py应用程序,需要在不损失精度的情况下汇总美元金额。我意识到我需要使用Decimals,但我发现自己必须用数据库包装我得到的每一个数字:

Decimal(str(myval))

在我疯狂添加到我的所有代码之前,有更好的方法吗?我是Python的新手,所以我很可能忽略了一些明显的东西。

编辑:我的数据库是MS SQL Server,我将数据存储在SQL Server money字段中(我相信实现类似于Decimal,即整数数学,不浮动点)。

我通过web2py框架(使用pyodbc进行SQL Server连接)连接到数据库。我相信web2py对小数类型有一些支持。例如,我的web2py字段定义如下所示:Field('Amount','decimal(19,4)')但是,当我使用web2py的.executesql方法从数据库返回值时,它将值返回为float而不是{{1 }}

编辑:这似乎是FreeTDS和MS SQL Server的问题。正如Massimo在评论中所说,web2py正确地支持它并返回一个Decimal(如果可以的话)。事实证明这只是我的生产环境(Linux)中的一个问题。我正在使用FreeTDS驱动程序连接到MS SQL,它似乎正在将MS SQL钱类型转换为python float。

我认为Alex Martelli的回答指向了正确的方向。有没有人有FreeTDS,MS SQL和python的经验?我认为这可能保证了自己的问题,所以我将讨论这个问题......(这里发布的新问题:FreeTDS translating MS SQL money type to python float, not Decimal

更新:FreeTDS实际上存在一个错误。截至2010年8月4日,这是FreeTDS的fixed in the CVS head

2 个答案:

答案 0 :(得分:8)

首先,将所有数字保存在数据库中的十进制形式 - 你没有提到你正在使用的数据库引擎,但是每个引擎都支持这样的功能,例如,here是MySQL的DECIMAL类型文档。我希望你已经这样做了,但是,如果你不是,那么仍然值得模式改变的痛苦。

然后,您需要确保进出DB的类型转换与Python的数据库小数匹配。不幸的是,没有标准的方法来跨DB-API实现,但大多数确实提供了一种方法;例如,使用MySQLDB,您需要在conv=中传递connect参数,称为“类型转换器字典” - 默认为MySQLdb.converters.conversions的副本,但您当然可以充实用小数做正确的事。如果您告诉我们您正在使用哪个数据库,以及您更喜欢哪种DB-API连接器包,我们可以为您提供有关此主题的更详细帮助。

编辑:@unutbu评论当前MySQLdb转换器已正确翻译小数,因此,除非你遇到一个非常旧的MySQLdb版本,你应该没事正确地将所有数字保存为数据库中的十进制数字(耶!)。

答案 1 :(得分:0)

你可以编写一个函数,它既可以从数据库中获取数字,然后将其转换为十进制数。然后在代码中使用它。