2013-01-11 5 views
10

Ich versuche, eine Teradata-Datenbank in Python mit PyODBC abzufragen. Die Verbindung zur Datenbank ist in Ordnung; Wenn ich jedoch versuche, Ergebnis abzurufen, stieß ich auf diesen Fehler "ungültiges Literal für Dezimal: u ''". Hilfe bitte.Problem mit der Abfrage von Teradata in Python/Pyodbc

Ich bin auf RHEL6, mit Python 2.7.3

Hier ist der Code und Ergebnis:

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

Sieht so aus, als ob der Treiber eine feste Punktnummer erwartet und einen leeren String zurück bekommt. Wie sieht Ihr Tabellenschema aus? In welche Reihe sollte es zurückkehren? – cmd

+1

Danke für Ihre Frage - es hat mir geholfen, die Teradata-Datenbankverbindung im Python-Skript einzurichten, die mit Ergebnismengen arbeiten muss :). – Jubbles

Antwort

0

ich, dass Pyodbc aus der Box funktionieren kann nicht gefunden als per http://code.google.com/p/pyodbc/issues/detail?can=1&q=teradata&id=146

Ich verifizierte die Fehlerbehebung in diesem Thread funktioniert. Check out https://github.com/mkleehammer/pyodbc, fügen Sie zusätzliche Befehle zu setup.py, neu kompilieren, und es scheint zu funktionieren.

+0

Der Link für das Problem ist nicht mehr aktuell, möglicherweise jetzt unter https://code.google.com/archive/p/pyodbc/issues/146? – Nickolay

0

Wenn Ihr Nullzeichen auf '?' (was ich glaube, ist der Standard) oder etwas anderes seltsam könnte dies ein Problem mit der Rückkehr sein, vor allem, wenn Sie mit den Daten arbeiten, sobald es Python trifft.

1

die richtigen locale in setup.py Forcing (vor dem Kompilieren) haben den Trick für mich, Beispiel:

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

ich diesen Fehler hatte, und ich fand die Ursache war, dass Pyodbc 64-Bit war, während mein Teradata-Treiber war 32. Das Problem wurde nach dem Erstellen eines neuen Treibers mit Unixodbc gelöst.