2013-04-23 6 views
1

pyodbc API의 fetch 메소드를 사용하여 결과를 가져 오는 경우이 문제가 발생합니다. 소수점 값은 두 자리로 반올림됩니다. MSSQL 데이터베이스에서, 특히 SQL 관리 Studio에서 저장 프로 시저를 EXEC하면 잔액, 쓴 (debits) 및 크레디트 값이 4 자리까지 올바르게 표시됩니다.pyodbc sqlserver 커서 십진수 반올림

나는 fetchall을 수행 한 후에 결과 집합을 포맷하려고 시도했지만 소수점 네 자리까지만 표시하지만 여전히 반올림합니다. 예 : 14.5272 => 14.5300.

<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를 설정 파일 : 템플릿에서

도 나는 여전히 반올림을 유지 아무 소용에 floatformat 필터를 사용했습니다. SQL 서버 2008을 사용합니다. Freetds v1.12, django-pyodbc v0.9 및 pyodbc v3.0.6.

[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 freetds.conf

[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) 및 프로젝트의 응용 프로그램을 가지고 올바르게 동기화하고 모든 앱에서 캐싱을 사용하고 문제가 발생하면이 문제의 원인이라고 생각하지 않습니다.

반올림 문제 이외에도 모든 것이 잘 작동합니다. 도움이 필요합니다.

+0

pyodbc 및 SQL Server 드라이버의 버전은 무엇입니까? – Bryan

+0

freetds v 1.12 (apt-get를 통해 설치됨)를 사용합니다. pyodbc v3.0.6 및 django-pyodbc v0.9 (모두 via pip). SQL Server 2008. 우분투 12.04. 문의 해 주셔서 감사합니다 Beargle – Adel

+0

FreeTDS를 사용하고 있다는 사실이 중요한 정보이므로'freetds.conf' 파일의 사본으로 질문을 업데이트하십시오. – Bryan

답변

1

나는 그것을 알아 냈다. 그래서 내가 부르고있는 저장 프로 시저에서 float 필드는 MONEY이고 2 개로 반올림되었다. 십진수 (7,4)으로 변경했는데 이제는 문제가 없습니다. odbc/freetds 구성을 변경하지 않았거나 필터 float 형식을 사용해야했습니다. 다시 고마워, beargle