2013-03-14 42 views
6

Tôi đang sử dụng MySQLdb để nói chuyện với cơ sở dữ liệu mysql và tôi có thể truy xuất động tất cả các tập kết quả.mysqldb chuyển đổi dữ liệu dấu thời gian thành Không

Vấn đề của tôi là khi tôi nhận được tập hợp kết quả, có một vài cột được khai báo là dấu thời gian trong mysql nhưng khi nó được truy xuất, nó sẽ chuyển thành Không.

Tôi có hai cột, cả hai đều được khai báo dấu thời gian nhưng một trả về dữ liệu chính xác trong khi các trả về khác Không có. Cả utime và enddate đều được khai báo dấu thời gian nhưng utime không trả lại chính xác trong khi enddate thực hiện.

['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 

Trả lời

7

Cuối cùng sau khi không ai trả lời hoặc cố gắng tìm thêm thông tin, tôi đã đi trước và tìm kiếm những giải pháp nhiều hơn và thấy rằng thư viện MySQLdb chuyển đổi kiểu dữ liệu từ sql để python và có một lỗi mà không chuyển đổi dấu thời gian.

Tôi vẫn không biết lý do tại sao một trong số đó được chuyển đổi và người kia thì không. Nếu ai đó có thể tìm ra điều đó, hãy cập nhật điều này.

Nhưng đây là sửa đổi cần được thực hiện khi kết nối với cơ sở dữ liệu mysql. MySQLdb không thể serialize một đối tượng 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

tôi stumbled khi cùng một vấn đề: Lấy dữ liệu của DATETIME(1) -type trả None.

Một số nghiên cứu đã đưa ra MySQLdb-Bug #325. Theo trình theo dõi lỗi đó, vấn đề vẫn mở (đã hơn 2 năm nay), nhưng các nhận xét cung cấp giải pháp làm việc:

Trong lần.py của gói MySQLdb, bạn cần chèn một số dòng để xử lý micro như thế này:

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 

những gì tôi không thể giải thích, tuy nhiên, là truy vấn ban đầu của bạn làm việc trên một cột và không mặt khác .. có lẽ, thứ hai không có bất kỳ micro-thông tin trong nó?

+0

Tại sao câu trả lời này bị bỏ phiếu? Thực tế, ba năm sau, lỗi này vẫn chưa được khắc phục là một sự kiện thú vị đối với tôi (và tôi cũng tin rằng nó sẽ dành cho người khác). Hơn nữa, nó nói rõ nguồn gốc và một giải pháp làm việc cho tôi .. – Fantilein1990

+0

Tôi không biết, con người. Điều này có vẻ hứa hẹn cho tôi, và nếu không có câu trả lời của bạn, tôi sẽ được để lại mà không có một workaround. – thegiffman

Các vấn đề liên quan