Python MySQLdb 返回 datetime.date 和 decimal
我有一个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
关键字参数:
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
,然后根据默认值做出合理的猜测,就找到了 10
和 246
这两个键。
连接建立后,也可以更改转换器:
connection.converter=conv
顺便问一下,你是怎么解决SQL查询的问题的?请把这个作为答案补充上。