2013-01-11 23 views
10

Próbuję wysłać zapytanie do bazy danych Teradata w Pythonie za pomocą PyODBC. Połączenie z bazą danych jest ustalone w porządku; jednak gdy próbuję pobrać wynik, natknąłem się na ten błąd "Invalid literal for Decimal: u ''". Prosimy o pomoc.Problem z zapytaniem Teradata w Pythonie/Pyodbc

jestem na RHEL6 z Python 2.7.3

Oto kod i wynik:

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

Wygląda na to, że sterownik oczekuje stałego numeru punktu i zwraca pusty ciąg znaków. Jak wygląda twój schemat tabeli? Jaki wiersz powinien powrócić? – cmd

+1

Dzięki za twoje pytanie - pomogło mi skonfigurować połączenie z bazą danych Teradata w skrypcie Pythona, który musi pracować z zestawami wyników :). – Jubbles

Odpowiedz

0

Jeśli twój znak null jest ustawiony na "?" (co moim zdaniem jest domyślne) lub cokolwiek innego dziwnego może to być problem z powracaniem, szczególnie jeśli pracujesz z danymi, gdy trafią w pythona.

1

wymuszanie odpowiedniego lokum w setup.py (przed kompilacją) wystarczyły na mnie, na przykład:

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

miałem ten błąd, i uważam, że przyczyną było to, że pyodbc było 64 bit, natomiast mój Sterownik teradata miał 32 punkty. Problem został rozwiązany po zbudowaniu nowego sterownika z unixodbc.

Powiązane problemy