2013-03-14 9 views
6

Używam MySQLdb do rozmowy z bazą danych mysql i jestem w stanie dynamicznie pobierać wszystkie zestawy wyników.mysqldb konwertuje dane sygnatury czasowej na Brak

Mój problem polega na tym, że gdy otrzymam zestaw wyników, jest kilka kolumn, które są zadeklarowane jako znaczniki czasu w mysql, ale gdy są pobierane, zmieniają się na None.

Mam dwie kolumny, obie są deklarowane znaczniki czasu, ale jeden zwraca poprawne dane, a inne zwraca Brak. Zarówno utime, jak i data końcowa są zadeklarowanymi znacznikami czasu, ale utime nie zwraca poprawnie, gdy kończy się data końcowa.

['utime', 'userstr', 'vstr_client', 'enddate'] 

((None, '000102030ff43260gg0809000000000004', '7.7.0', '1970-01-01 12:00:00.000000')) 

def parse_data_and_description(cursor, data): 

    res = [] 
    cols = [d[0] for d in cursor.description] 
    print cols 
    print data 

    for i in data: 
     res.append(OrderedDict(zip(cols, i))) 
    return res 

def call_multi_rs(sp, args): 

    rs_id=0; 
    conn = connect() 
    cursor = conn.cursor() 
    try: 
     conn.autocommit(True) 
     cursor.execute ("CALL %s%s" % (sp, args)) 
     while True: 
      rs_id+=1 
      data = cursor.fetchone() 
      listout = parse_data_and_description(cursor, data) 
      print listout 
      if cursor.nextset()==None: 
      # This means no more recordsets available 
      break 

Odpowiedz

7

Wreszcie po nikt nie odpowiedział lub próbowali znaleźć więcej informacji, poszedł do przodu i spojrzał na więcej rozwiązań i okazało się, że biblioteka MySQLdb konwertuje typy danych z SQL do pytona i nie jest to błąd, który nie konwertuje znacznik czasu.

Nadal nie wiem, dlaczego jeden z nich jest nawrócony, a drugi nie. Jeśli ktoś może to zrozumieć, zaktualizuj to.

Ale tutaj jest modyfikacja, która musi zostać wykonana podczas łączenia się z bazą danych mysql. MySQLdb nie może serializacji obiektu python datetime

try: 
    import MySQLdb.converters 
except ImportError: 
    _connarg('conv') 

def connect(host='abc.dev.local', user='abc', passwd='def', db='myabc', port=3306): 

    try: 
     orig_conv = MySQLdb.converters.conversions 
     conv_iter = iter(orig_conv) 
     convert = dict(zip(conv_iter, [str,] * len(orig_conv.keys()))) 
     print "Connecting host=%s user=%s db=%s port=%d" % (host, user, db, port) 
     conn = MySQLdb.connect(host, user, passwd, db, port, conv=convert) 
    except MySQLdb.Error, e: 
     print "Error connecting %d: %s" % (e.args[0], e.args[1]) 
    return conn 
2

natknąłem się na ten sam problem: Odzyskiwanie danych z DATETIME(1) -type powraca None.

Niektóre badania przyniosły MySQLdb-Bug #325. Według tego narzędzia do śledzenia błędów problem jest nadal otwarty (od ponad 2 lat), ale komentarze zapewniają działające rozwiązanie:

W pliku times.py pakietu MySQLdb należy wstawić kilka linii do obsługi mikrosekund jak ten:

def DateTime_or_None(s): 
    if ' ' in s: 
     sep = ' ' 
    elif 'T' in s: 
     sep = 'T' 
    else: 
     return Date_or_None(s) 

    try: 
     d, t = s.split(sep, 1) 
     if '.' in t: 
      t, ms = t.split('.',1) 
      ms = ms.ljust(6, '0') 
     else: 
      ms = 0 
     return datetime(*[ int(x) for x in d.split('-')+t.split(':')+[ms] ]) 
    except (SystemExit, KeyboardInterrupt): 
     raise 
    except: 
     return Date_or_None(s) 

def TimeDelta_or_None(s): 
    try: 
     h, m, s = s.split(':') 
     if '.' in s: 
      s, ms = s.split('.') 
      ms = ms.ljust(6, '0') 
     else: 
      ms = 0 
     h, m, s, ms = int(h), int(m), int(s), int(ms) 
     td = timedelta(hours=abs(h), minutes=m, seconds=s, 
         microseconds=ms) 
     if h < 0: 
      return -td 
     else: 
      return td 
    except ValueError: 
     # unpacking or int/float conversion failed 
     return None 

def Time_or_None(s): 
    try: 
     h, m, s = s.split(':') 
     if '.' in s: 
      s, ms = s.split('.') 
      ms = ms.ljust(6, '0') 
     else: 
      ms = 0 
     h, m, s, ms = int(h), int(m), int(s), int(ms) 
     return time(hour=h, minute=m, second=s, microsecond=ms) 
    except ValueError: 
     return None 

nie mogę wyjaśnić, choć jest oryginalna kwerenda działa na jednej kolumnie, a nie na innych .. Być może, drugi nie ma żadnych mikrosekund-informacji w nim?

+0

Dlaczego ta odpowiedź została odrzucona? Fakt, że trzy lata później błąd nadal nie został naprawiony, był dla mnie interesujący (i moim zdaniem będzie również dla innych). Ponadto podaje źródło i rozwiązanie, które zadziałało dla mnie. – Fantilein1990

+0

Nie wiem, stary. Wydaje mi się to obiecujące, a bez twojej odpowiedzi pozostanę bez obejścia. – thegiffman

Powiązane problemy