【问题标题】:Python MySQLdb returns datetime.date and decimalPython MySQLdb 返回 datetime.date 和十进制
【发布时间】:2011-11-20 22:52:39
【问题描述】:

我有一个 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], ...]

【问题讨论】:

  • 当我做 DATE_FORMAT(mydate, '%Y-%m-%d') 输出是 [['2011-1-03', 'PR', Decimal('1')] ,[...]] 然后我添加了 CONVERT(qtySold, UNSIGNED) 输出是 [['2011-1-03', 'PR', 1L],[...]] 现在日期问题已经解决了,是他们对 qtySold 有什么解决方案吗?

标签: python mysql-python


【解决方案1】:

如果你的意思是你想要 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

【讨论】:

  • 我可以在查询级别做些什么?这会很有帮助。
  • 您可以通过conv 参数将项目添加到类型转换表到.connect(): mysql-python.sourceforge.net/MySQLdb.html#mysqldb
  • 我是第一次这样做。您能否使用 conv 转换我的查询
  • 如果这是您第一次阅读文档并自己学习如何做,还有什么更好的时间呢?你似乎没有被卡住——我已经给你一个非常直接的指针,告诉你你需要做什么,以及解释如何做的页面。如果您有具体问题,请提出,但请不要只要求 StackOverflow 用户为您编写代码。
【解决方案2】:

默认转换器,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 查询的问题的?请将其添加为答案。

【讨论】:

  • +1,这就解释了为什么我有Decimal 实例出现在下游:) 我相信你知道,但是如果其他人遇到这个,常量定义本身可以在@987654330 中找到@使用from MySQLdb.constants import FIELD_TYPE(表示MySQL列类型的常量-FIELD_TYPE.DECIMAL = 0FIELD_TYPE.TIMESTAMP = 7等)。
  • 正如我刚刚发现的,您可能想要使用 FIELD_TYPE.NEWDECIMAL (246) 而不是 FIELD_TYPE.DECIMAL (0)
  • 如果你使用 pymysql,这对你有用conv = pymysql.converters.conversions.copy()
  • 有没有办法调整转换器以防止 unicode 字符串?我的任务是将工具从一个系统迁移到另一个系统,但似乎某些后台配置不一致。即,我将很多列标识符恢复为 u'column_name',这破坏了我的 javascript。是否有一站式的地方为该转换编码?
【解决方案3】:

MySQLdb 试图提供帮助,为您提供 SQL 数据类型的 Python 版本。

但是,如果由于某种原因需要字符串,您可以将返回的所有内容字符串化。所以像[[str(val) for val in row] for row in results] 这样的东西应该这样做。

【讨论】:

  • 在最底部,零票,是对我有用的东西。其他答案在语法上不正确。这个特别适用于以下语法:retVal["rows"] = [[str(val) for val in row] for row in dbCursor.fetchall()]
  • 当您需要为 int 和 float 等返回正确的类型时,这无用。
【解决方案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()

【讨论】:

    【解决方案5】:

    如果你使用 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)
    

    现在十进制正在转换为浮点数

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 2013-09-09
      • 1970-01-01
      • 2018-05-16
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2020-03-28
      相关资源
      最近更新 更多