我使用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]]
换句话说,我只想要一个数组数组。
我正在遵循的步骤:
fetchall()
将行存储在变量render_template
在javascript set变量中等于传入的数据
var data={{dataset}};
console.log(data);
我已经看过许多烧瓶示例,他们采用结果集并迭代它来打印html中的行,但我想使用结果数据集作为我的d3代码的输入。为什么显示数据类型?为什么它也不会显示整数列的数据类型?
我猜这个问题与行构造有关,但我尝试创建一个列表而不能删除数据类型信息。然后,由于&符号,我得到了各种各样的错误。
答案 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}};