pyodbc API のいずれかのフェッチ メソッド (この例では fetchall) を使用して結果をフェッチすると、この問題が発生します。10 進数値は 2 桁に丸められます。MSSQL データベースでは、特に SQL 管理スタジオでは、ストアド プロシージャを実行すると、残高、借方、および貸方の値が 4 桁まで正しく表示されます。
fetchall 後に結果セットをフォーマットしようとしましたが、小数点以下 4 桁が表示されますが、それでも切り上げられます。たとえば、14.5272 => 14.5300 です。
テンプレートでも、 floatformat フィルターを使用してみましたが、まだ丸め続けています。
<td >{{ Accounts.debits|floatformat:4 }}</td>
models.py
from django.core.cache import cache
from django.conf import settings
class Account(models.Model):
account = models.IntegerField(primary_key=True, db_column='Account')
description = models.TextField(db_column='Description')
balance = models.DecimalField(decimal_places=4, max_digits=19, db_column='Balance')
debits = models.DecimalField(decimal_places=4, max_digits=19, db_column='Debits')
credits = models.DecimalField(decimal_places=4, max_digits=19, db_column='Credits')
class Meta:
db_table = 'Account'
permissions = (("view_accounts", "Can view accounts"),
)
@staticmethod
def resultSet(startDate, endDate):
try:
cur = connection.cursor()
cacheKey = 'Account_%s_%s' %(startDate, endDate)
cachedSp = cache.get(cacheKey)
print cacheKey
if not cachedSp:
print 'not cached'
cur.execute('database.dbo.AccountsSelect %s, %s', (str(startDate), str(endDate)))
cachedSp = cur.fetchall()
#for row in cachedSp:
#if row[5]!= -1:
#print format(row['debit'],'%4f')
cachedSp = cur.fetchall()
cur.close()
cache.set(cacheKey,cachedSp,settings.CACHE_CUSTOM_APP_SECONDS)
except Exception, e:
print e.args
return [Account(*row) for row in cachedSp]
以下は、odbc/freetds 構成ファイルです。私は SQL サーバー 2008 を使用しています。Freetds v1.12、django-pyodbc v0.9、および pyodbc v3.0.6。
freetds.conf
[global]
# TDS protocol version
; tds version = 8.0
# Whether to write a TDSDUMP file for diagnostic purposes
# (setting this to /tmp is insecure on a multi-user system)
; dump file = /tmp/freetds.log
; debug flags = 0xffff
# Command and connection timeouts
; timeout = 10
; connect timeout = 10
# If you get out-of-memory errors, it may mean that your client
# is trying to allocate a huge buffer for a TEXT field.
# Try setting 'text size' to a more reasonable limit
text size = 64512
[tes-db-1]
host = tes-db-1.doamin.test.com
port = 1433
tds version = 8.0
odbc.ini
[default]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Servername = SERVER
Database = DATABASE
odbcinist.ini
[FreeTDS]
Description = TDS Driver (Sybase / MS-SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 1
client charset = utf-8
また、設定ファイル (INSTALLED_APPS) にアプリがあり、プロジェクトが正しく同期されており、すべてのアプリでキャッシュを使用していますが、それが問題になる場合は、この問題の原因ではないと思います。
この丸めの問題以外はすべて正常に機能しています。助けていただければ幸いです。