2016-10-04 42 views
1

通过pwiz我的MySQL数据库,我得到:peewee的DateField属性是无与MySQL数据库

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

回答

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