Python MySQLdb 返回 datetime.date 和 decimal

13 投票
5 回答
20547 浏览
提问于 2025-04-17 02:40

我有一个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')

有没有办法让我得到正常的数据,这样我就可以把它传递给用户界面进行处理?我说的正常数据是指:

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

5 个回答

4

你可以通过在查询语句中强制将特定的列转换为字符型(CHAR),来避免出现转换的问题。

import MySQLdb
import datetime 
conn = MySQLdb.connect(host= "mysql-server",user="weblogadmin", passwd="admin123",db="weblog_db") 
sqlcursor = conn.cursor() 
sqlcursor.execute("SELECT logrole,logserver,logtype,loglevel,CAST(logdatetime AS CHAR),logdetail,logaction,logread FROM logapp_logtable") 
row = sqlcursor.fetchall() 
for data in row:    
    print(str(data)) 
conn.close()
7

如果你想把日期变成字符串类型(str),而把数字变成整数类型(int),可以看看这个链接:datetime.date.strftime()int()

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

>>> int(Decimal(2))
2

如果你想系统性地改变 MySQLdb 返回的不同列类型,可以查看 MySQLdb.connect()conv 关键字参数:

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

33

默认的转换器是 MySQLdb.converters.conversions,它是一个字典,里面有这样的条目:

{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会话中查看 MySQLdb.converters.conversions,然后根据默认值做出合理的猜测,就找到了 10246 这两个键。

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

connection.converter=conv

顺便问一下,你是怎么解决SQL查询的问题的?请把这个作为答案补充上。

撰写回答