将数据库查询结果从字符串有效转换为元组

时间:2014-02-05 11:28:40

标签: python sql database sqlite python-2.7

我有一个sqlite查询,它返回以下元组的python列表:

[(u'1623,0.0,1651,2.0e-06,1679,5.0e-06,1707,7.0e-06,1735,9.0e-06,1762,1.1e-05,1790,1.4e-05'),
( u'1933,458273.7,1940,460182.6,1947,464019.3,1954,465922.8,1961,467856.0,1968,479385.0')]

这里的每个字符串包含一对x,y对的元组,即一个项目是1623,0.0 我想要的输出是:

[(1623,0.0,1651,2.0e-06,1679,5.0e-06,1707,7.0e-06,1735,9.0e-06,1762,1.1e-05,1790,1.4e-05),
(1933,458273.7,1940,460182.6,1947,464019.3,1954,465922.8,1961,467856.0,1968,479385.0)]

有没有一种有效的方法来执行此翻译?

也许它可以在sql级别执行,但我不这么认为,我的查询如下:

select group_concat( COALESCE(timestamp, "")
                     || COALESCE(",", "")
                     || COALESCE(value, "") )
              from table where type='VALUE' group by eventid;

我无法找到一种方法来连接多个列而不将其转换为字符串

1 个答案:

答案 0 :(得分:2)

不要在SQL中分组,在Python中分组并避免必须序列化然后反序列化您的值:

from itertools import groupby
from operator import itemgetter


cursor.execute('''select eventid, timestamp, value from table
                  where type="VALUE" order by eventid''')
for eventid, rows in groupby(cursor, itemgetter(0)):
    print eventid
    for _, timestamp, value in rows:
        print timestamp, value

仅当您需要聚合数据(总和,计算平均值,计数等)时才使用SQL中的分组,而不是在需要来自组的单个行进行进一步处理时。

如果您需要完全按照描述的输出(带有时间戳的元组,重复的值对),您可以使用以下内容生成输出:

from itertools import groupby
from operator import itemgetter

cursor.execute('''select eventid, timestamp, value from table
                  where type="VALUE" order by eventid''')
result = [tuple(chain.from_iterable(r[1:] for r in rows))
          for eventid, rows in groupby(cursor, itemgetter(0))]

e.g。对于每个唯一的eventid,都会生成一个由链式时间戳和值列组成的元组。