Python MySQLdb返回datetime.date和decimal

时间:2011-09-20 09:59:54

标签: python mysql-python

我有一个MySQL查询,如:

SELECT mydate, countryCode, qtySold from sales order mydate, countryCode

这将返回元组的元组,其值为:

((datetime.date(2011, 1, 3), 'PR', Decimal('1')), (datetime.date(2011, 1, 31), 'MX', Decimal('1')))

当我尝试使用循环打印时,它打印得非常好:

2011-1-3, PR, 1
2011-1-31, MX, 1

但是当我尝试返回此值时,它将返回

datetime.date(2011, 1, 3), 'PR', Decimal('1')

有没有办法可以获得普通数据,以便我可以将其传递给UI进行处理?通过正常数据我的意思是:

[['2011-1-03', 'PR', 1], ...]

5 个答案:

答案 0 :(得分:29)

默认转换器MySQLdb.converters.conversions是一个dict,其条目如下:

{0: <class 'decimal.Decimal'>,
 1: <type 'int'>,
 2: <type 'int'>,
 3: <type 'long'>,
 4: <type 'float'>,
 5: <type 'float'>,
 7: <function mysql_timestamp_converter at 0x89e4454>,
 8: <type 'long'>,
 9: <type 'int'>,
 10: <function Date_or_None at 0x89e43ac>,
 ...
}

您可以更改转换器并将其传递给connect方法,如下所示:

conv=converters.conversions.copy()
conv[246]=float    # convert decimals to floats
conv[10]=str       # convert dates to strings
connection=MySQLdb.connect(
    host=HOST,user=USER,
    passwd=PASS,db=DB,
    conv=conv
    )

通过在交互式Python会话中检查10并根据默认值进行有根据的猜测,找到了密钥246MySQLdb.converters.conversions

连接后也可以更改转换器:

connection.converter=conv

顺便问一下,您是如何通过SQL查询解决问题的?请添加它作为答案。

答案 1 :(得分:5)

如果您的日期需要str类型,而数字需要int类型,请查看datetime.date.strftime()int()

>>> datetime.date(2011, 1, 3).strftime("%Y-%m-%d")
'2011-01-03'

>>> int(Decimal(2))
2

如果您想系统地更改MySQLdb针对各种列类型返回的类型,请参阅conv的{​​{1}}关键字参数:

http://mysql-python.sourceforge.net/MySQLdb.html#mysqldb

答案 2 :(得分:3)

MySQLdb正在尝试提供帮助,为您提供SQL数据类型的Python版本。

但是如果由于某种原因需要字符串,你可以将你得到的所有东西串起来。所以像[[str(val) for val in row] for row in results]之类的东西应该这样做。

答案 3 :(得分:3)

您可以通过强制在查询字符串中将特定列强制转换为CHAR来避免获得转换

first_value = (total_sum - sum_of_all_other_values_and_multipliers) / multiplier_key

答案 4 :(得分:0)

如果您使用 pymysql 而不是 MySQLdb,答案是相似的。首先导入转换器和常量类型。复制使用的通用转换器,并将小数点更改为浮点数。

import pymysql
from pymysql.constants import FIELD_TYPE
from pymysql.converters import conversions

conv = conversions.copy()
conv[FIELD_TYPE.DECIMAL] = float
conv[FIELD_TYPE.NEWDECIMAL] = float

之后,在您的连接中使用 conv dict。

connection = pymysql.connect(host = db_host,     
                                 user = db_user,    
                                 passwd = db_pass,
                                 db = db_db,
                                 charset='utf8mb4',
                                 conv = conv,
                               max_allowed_packet = 33554432,
                                    cursorclass=pymysql.cursors.DictCursor)

现在十进制被转换为浮点