2013-01-11 7 views
10

Sto provando a interrogare un database Teradata in Python con PyODBC. La connessione al database è stabilita bene; tuttavia, quando provo a recuperare il risultato, mi sono imbattuto in questo errore "letterale non valido per decimale: u ''". Aiuto per favore.Problema con query di Teradata in Python/Pyodbc

Sono in RHEL6, con Python 2.7.3

Ecco il codice e risultato:

import pyodbc 

sql = "select * from table" 

pyodbc.pooling = False 
cnx = pyodbc.connect("DRIVER={Teradata};DBCNAME=host;DATABASE=database; AUTHENTICATION=LDAP;UID=user;PWD=password", autocommit=True, ANSI=True) 
cursor = cnx.cursor() 
rows = cursor.execute(sql).fetchone() 

InvalidOperation       Traceback (most recent call last) 
<ipython-input-25-f2a0c81ca0e4> in <module>() 
----> 1 test.fetchone() 

/usr/local/lib/python2.7/decimal.pyc in __new__(cls, value, context) 
    546      context = getcontext() 
    547     return context._raise_error(ConversionSyntax, 
--> 548         "Invalid literal for Decimal: %r" % value) 
    549 
    550    if m.group('sign') == "-": 

/usr/local/lib/python2.7/decimal.pyc in _raise_error(self, condition, explanation, *args) 
    3864   # Errors should only be risked on copies of the context 
    3865   # self._ignored_flags = [] 
-> 3866   raise error(explanation) 
    3867 
    3868  def _ignore_all_flags(self): 

InvalidOperation: Invalid literal for Decimal: u'' 
+0

Sembra che il conducente si aspetti un numero di punto fisso e che torni indietro una stringa vuota. Com'è il tuo schema di tabella? Quale riga dovrebbe tornare? – cmd

+1

Grazie per la tua domanda - mi ha aiutato a configurare la connessione al database Teradata nello script Python che deve funzionare con i set di risultati :). – Jubbles

risposta

0

Se il carattere null è impostato su "?" (che credo sia il default) o qualsiasi altra cosa strana questo potrebbe essere un problema con il ritorno, specialmente se si sta lavorando con i dati una volta che ha colpito python.

1

Forzare il locale proprio nel setup.py (prima di compilare) ha fatto il trucco per me, ad esempio:

import locale 
locale.setlocale(locale.LC_ALL, 'es_ES.utf8') 
1

ho avuto questo errore, e ho trovato la causa era che pyodbc era a 64 bit, mentre il mio il driver teradata era 32. Il problema è stato risolto dopo aver creato un nuovo driver con unixodbc.