【问题标题】:mysqldb converts timestamp data to Nonemysqldb 将时间戳数据转换为无
【发布时间】:2013-03-03 11:06:45
【问题描述】:

我正在使用 MySQLdb 与 mysql 数据库通信,并且能够动态检索所有结果集。

我的问题是,一旦我得到结果集,有几列在 mysql 中被声明为时间戳,但是当它被检索时,它变成了无。

我有两列,两列都是声明的时间戳,但一列返回正确数据,另一列返回无。 utime 和 enddate 都是声明的时间戳,但 utime 不会正确返回而 enddate 会。

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

【问题讨论】:

    标签: datetime timestamp type-conversion mysql-python


    【解决方案1】:

    最后在没有人回答或尝试查找更多信息后,我继续寻找更多解决方案,发现 MySQLdb 库将数据类型从 sql 转换为 python 并且存在不转换时间戳的错误。

    我仍然不知道为什么其中一个被转换而另一个没有。如果有人能弄清楚,请更新这个。

    但是这里是连接mysql数据库时需要做的修改。 MySQLdb 无法序列化 python 日期时间对象

    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】:

      我偶然发现了同样的问题:检索DATETIME(1) 类型的数据返回None

      一些研究提出了MySQLdb-Bug #325。根据那个错误跟踪器,这个问题仍然存在(现在已经有 2 年多了),但是 cmets 提供了一个可行的解决方案:

      在 MySQLdb 包的 times.py 中,你需要像这样插入几行来处理微秒:

      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
      

      但是,我无法解释的是,您的原始查询是在一个列上工作,而不是在另一列上工作。也许,第二个查询中没有任何微秒信息?

      【讨论】:

      • 为什么这个答案被否决了?事实上,三年后该错误仍未修复,这对我来说是一个有趣的事实(我相信对其他人也是如此)。此外,它说明了对我有用的来源和解决方案..
      • 我不知道,伙计。这对我来说看起来很有希望,如果没有你的回答,我将无法解决问题。
      • 你们是通过 pip 安装 MySQLdb 的吗?我的 py2.7 安装(从 2014 年开始)与您的帖子具有相同的代码。我的 py3.6 安装(从 2017 年开始)具有不同的代码,但仍处理微秒。
      猜你喜欢
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多