[英]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.