1

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) にアプリがあり、プロジェクトが正しく同期されており、すべてのアプリでキャッシュを使用していますが、それが問題になる場合は、この問題の原因ではないと思います。

この丸めの問題以外はすべて正常に機能しています。助けていただければ幸いです。

4

1 に答える 1