首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除查询结果中的数据类型

如何删除查询结果中的数据类型
EN

Stack Overflow用户
提问于 2017-01-09 09:39:58
回答 1查看 1.2K关注 0票数 0

我使用pymssql库查询结果,下面是一个示例:

('999001',‘4871C9DF-6E95-458 B-B 763-6BBB6C75F5D’,1,True,2,'EOI',‘EOI’,无,无,4,假,假,‘整体’,假,没有,没有,‘美元’,没有‘投资’,没有,'JLL交易‘,’独家授权‘,’销售咨询‘,无,’韩国标准时间‘,无,无,没有,零,1,0,0,真,‘整体’,假,没有,'1',零,十进制(‘0.05’),'100%',无,‘平方英尺’,‘美元’,‘120000000.00’(‘120000000.00’),‘1.20亿美元’,‘120000000.00’,‘1.2亿美元’,没有,“没有”、“120000000.00”、“未披露”、“哈维尔有限公司”、“令人兴奋的投资机会--通往首尔的门户”、“一个激动人心的投资机会--通往首尔的门户”、“没有、没有”、datetime.datetime(2016年、1、15、0、5、51、480000)、datetime.datetime(2016年、12、7、5、6,52,633000),1,无)

但是我发现有像Decimal('120000000.00')datetime.datetime(2016, 1, 15, 0, 5, 51, 480000)这样的值。我只想获得没有Decimal()和datetime.datetime()的原始值。我如何实现这一点?

这是我的代码:

代码语言:javascript
复制
def extract_opportunities(sql):
    cursor.execute(sql)
    opportunities = cursor.fetchall()
    attributes = get_attributes_of_table(cursor)
    availability_id_idx = attributes.index("availabilityid")
    opportunity_dict = dict()
    for idx, val in enumerate(opportunities):
        opportunity_key = val[availability_id_idx]
        opportunity_value = dict(zip(attributes, val))
        opportunity_dict[opportunity_key] = opportunity_value

此函数的目的是构造具有属性和值对的JSON格式文件,如下所示:

代码语言:javascript
复制
{'Price': '120000000.00'} 

而不是

代码语言:javascript
复制
{'Price': Decimal('120000000.00')}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-09 17:08:06

可以将default函数传递给json.dumps方法,该方法将Decimal转换为字符串,如下所示:

代码语言:javascript
复制
import datetime
from decimal import Decimal
import json
import pymssql

def json_dumps_default(obj):
    # ref: http://stackoverflow.com/a/16957370/2144390
    if isinstance(obj, Decimal):
        return str(obj)
    if isinstance(obj, datetime.datetime):
        return str(obj)
    raise TypeError

conn = pymssql.connect(
    host=r'localhost:49242',
    database='myDb'
    )
crsr = conn.cursor(as_dict=True)
sql = """\
SELECT
    CONVERT(DECIMAL(18,4), 120000000) AS Price,
    CONVERT(DATETIME, '2016-12-07 05:06:52.633') AS SaleDate
UNION ALL
SELECT
    CONVERT(DECIMAL(18,4), 340000000) AS Price,
    CONVERT(DATETIME, '2017-01-09 07:44:32.1') AS SaleDate
"""
crsr.execute(sql)
rows = crsr.fetchall()
print()
print("Rows as returned by pymssql:")
print(rows)

as_json = json.dumps(rows, default=json_dumps_default, sort_keys=False, indent=2)
print()
print("Rows as returned by json.dumps:")
print(as_json)

crsr.close()
conn.close()

控制台输出是:

代码语言:javascript
复制
Rows as returned by pymssql:
[{'Price': Decimal('120000000.0000'), 'SaleDate': datetime.datetime(2016, 12, 7, 5, 6, 52, 633000)}, {'Price': Decimal('340000000.0000'), 'SaleDate': datetime.datetime(2017, 1, 9, 7, 44, 32, 100000)}]

Rows as returned by json.dumps:
[
  {
    "Price": "120000000.0000",
    "SaleDate": "2016-12-07 05:06:52.633000"
  },
  {
    "Price": "340000000.0000",
    "SaleDate": "2017-01-09 07:44:32.100000"
  }
]

注意,函数可以返回float(obj)而不是str(obj)来表示Decimal值,但是可能会出现精度下降的情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41544934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档