Python MySQLdb возвращает datetime.date и десятичное число - PullRequest
12 голосов
/ 20 сентября 2011

У меня есть запрос 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], ...]

Ответы [ 4 ]

29 голосов
/ 20 сентября 2011

Преобразователь по умолчанию, 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
    )

Ключи 10 и 246 были найдены путем проверки MySQLdb.converters.conversions в интерактивном сеансе Python и создания обоснованного предположения на основе значений по умолчанию.

Преобразователь также можно изменить после установления соединения:

connection.converter=conv

Кстати, как вы решили проблему с SQL-запросом? Пожалуйста, добавьте это как ответ.

5 голосов
/ 20 сентября 2011

Если вы имеете в виду, что вы хотите str типов для ваших дат и int типов для ваших номеров, посмотрите на datetime.date.strftime() и int():

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

>>> int(Decimal(2))
2

Есливы хотите систематически изменять типы MySQLdb, возвращаемые для различных типов столбцов, см. аргумент ключевого слова conv для MySQLdb.connect():

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

3 голосов
/ 13 ноября 2015

Вы можете избежать преобразования, принудительно приведя конкретный столбец к типу 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()
3 голосов
/ 21 сентября 2011

MySQLdb пытается помочь вам, предоставляя вам Python-версии ваших типов данных SQL.

Однако, если по какой-то причине нужны строки, вы можете просто зачеркнуть все, что получите. Так что-то вроде [[str(val) for val in row] for row in results] должно это сделать.

...