【问题标题】:pyodbc result set has data type embeddedpyodbc 结果集具有嵌入的数据类型
【发布时间】:2016-06-28 01:15:07
【问题描述】:

我正在使用 pyodbc 和烧瓶查询 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将变量传递给我的html页面
  6. 在javascript中设置变量等于传入的数据

    var data={{dataset}};  
    console.log(data);
    

我见过很多烧瓶示例,它们获取结果集并遍历它以打印 html 中的行,但我想使用生成的数据集作为我的 d3 代码的输入。为什么显示数据类型?为什么它不会同时显示整数列的数据类型?

我猜这个问题与行结构有关,但我尝试创建一个列表,但无法摆脱数据类型信息。然后,由于与号,我得到了各种错误。

【问题讨论】:

    标签: javascript python flask pyodbc


    【解决方案1】:

    我认为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 - 将参数作为json 对象传递给模板:

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

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

    var data = {{dataset}};
    

    【讨论】:

    • 这成功了!我之前曾尝试将结果转换为 json,但没有成功。非常感谢!
    • @dobbysock87 .. 很高兴我能帮上忙 .. ;)
    【解决方案2】:
    import re
    processed = []
    for piece in results:
        processed.append([re.sub(".*?(-?\d+\.\d+).*", "\1", repr(piece[0])), piece[1]]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多