通过我的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 peewee和here for pymysql。
答案 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