pyodbc结果集的数据类型已嵌入

时间:2016-06-28 01:15:08

标签: javascript python flask pyodbc

我使用pyodbc和flask查询Teradata,目的是使用d3绘制数据图表。

结果集有两列,一列是十进制,另一列是整数。当我将结果传递给我的html页面并记录输出时,我得到了以下几点:

[(Decimal(& #39;-16.200000000& #39;), 5), (Decimal(& #39;-23.100000000& #39;), 12), (Decimal(& #39;500.300000000& #39;), 5)]. 

嵌入数据类型信息使得难以对结果集执行任何操作。我怎样才能让输出看起来像这样呢?

[[-16.200000000, 5], [-23.100000000, 12], [500.300000000, 5]]

换句话说,我只想要一个数组数组。

我正在遵循的步骤:

  1. 创建连接
  2. 创建游标
  3. 执行SQL
  4. 使用fetchall()将行存储在变量
  5. 使用render_template
  6. 将变量传递到我的html页面
  7. 在javascript set变量中等于传入的数据

    var data={{dataset}};  
    console.log(data);
    
  8. 我已经看过许多烧瓶示例,他们采用结果集并迭代它来打印html中的行,但我想使用结果数据集作为我的d3代码的输入。为什么显示数据类型?为什么它也不会显示整数列的数据类型?

    我猜这个问题与行构造有关,但我尝试创建一个列表而不能删除数据类型信息。然后,由于&符号,我得到了各种各样的错误。

2 个答案:

答案 0 :(得分:0)

import re
processed = []
for piece in results:
    processed.append([re.sub(".*?(-?\d+\.\d+).*", "\1", repr(piece[0])), piece[1]]

这些方面的东西。它显示该数据,因为它的类型为Decimal(teradata类型)。我猜repr()会给你在日志中看到的相同结果......然后只需将它正则表达到你想要的结果。

答案 1 :(得分:0)

我认为更好的方法是在 this 答案中提供的,因为最好将查询数据dumps转换为json对象,您可以使用JS轻松地从客户端检索它,而无需使用正则表达式或其他机制解析它。

<强>步骤进行:

1 - 对json.JSONEncoder

进行子类化
class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            return float(o) #Type conversion happens here
        return super(DecimalEncoder, self).default(o)

2 - 将params作为json对象传递给模板:

data = json.dumps({'pi': decimal.Decimal('3.14')}, cls=DecimalEncoder)
return render_template('mytemplate.html', dataset=data)

3 - 在JS中回读查询结果:

var data = {{dataset}};