2016-10-04 66 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