[英]Python MySQLdb returns datetime.date and 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')
有没有办法可以获取普通数据,以便将其传递给 UI 进行处理? 正常数据我的意思是:
[['2011-1-03', 'PR', 1], ...]
默认转换器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 查询解决问题的? 请将其添加为答案。
如果您的意思是希望日期为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
关键字参数:
您可以通过强制将特定列强制转换为查询字符串中的 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()
MySQLdb 试图提供帮助,为您提供 SQL 数据类型的 Python 版本。
但是,如果出于某种原因需要字符串,您可以将返回的所有内容字符串化。 所以像[[str(val) for val in row] for row in results]
应该这样做。
如果您使用 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)
现在十进制被转换为浮点数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.