MySQL数据库的peewee DateField属性为None

时间:2016-10-04 14:16:54

标签: python mysql peewee

通过我的MySQL数据库上的pwiz,我得到:

class BaseModel(Model):
    class Meta:
        database = database

class Pub(BaseModel):
    ...
    author = TextField(null=True)
    ...
    publish_date = DateField(null=True)
    ...

然后,在迭代entry in Pub.select()时,entry.publish_date总是None,尽管数据库中的所有条目都设置了日期(或者至少是其中的一部分,例如年份,即像2016-00-00)这样的条目。

(有一个related question,但问题不同:它没有设置,因此解决方案是auto_now_add。)

为什么?也许formats错了?如何解决这个问题?

如何调试?

一些调试:

我想peewee会使用pymsql。所以我试着这么简单:

import pymysql
conn = pymysql.connect(...)
cur = conn.cursor()
cur.execute("SELECT publish_date FROM pub")

然后迭代row in cur,我只会获得row == (None,)

在预先将值转换为char时,它可以正常工作,即我将值作为字符串获取:

cur.execute("SELECT CAST(publish_date AS char) FROM pub")

我认为这是一个错误。我报告了此here for peeweehere for pymysql

1 个答案:

答案 0 :(得分:0)

这是一个problem/bug in pymysql,虽然还不清楚pymysql应该如何处理它。

目前,这种猴子补丁方法在某种程度上解决了这个问题;如果日期不能表示为datetime对象,它会将日期作为字符串返回。

def monkey_patch_pymysql_date_fix():
    import pymysql
    orig_convert_date = pymysql.converters.convert_date
    def fixed_convert_date(obj):
        res = orig_convert_date(obj)
        if res is None:
            return obj
        return res
    pymysql.converters.convert_date = fixed_convert_date
    from pymysql.constants import FIELD_TYPE
    pymysql.converters.decoders[FIELD_TYPE.DATE] = fixed_convert_date
    pymysql.converters.conversions[FIELD_TYPE.DATE] = fixed_convert_date