簡體   English   中英

Python MySQLdb 返回 datetime.date 和十進制

[英]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並根據默認值進行有根據的猜測,找到了鍵10246

連接完成后也可以更換轉換器:

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關鍵字參數:

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

您可以通過強制將特定列強制轉換為查詢字符串中的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM