Python peewee DateField属性在MySQL数据库中为None
通过MySQL数据库上的Python peewee DateField属性在MySQL数据库中为None,python,mysql,peewee,Python,Mysql,Peewee,通过MySQL数据库上的pwiz,我得到: class BaseModel(Model): class Meta: database = database class Pub(BaseModel): ... author = TextField(null=True) ... publish_date = DateField(null=True) ... 然后,在Pub.select()中迭代条目时,entry.publish\u
pwiz
,我得到:
class BaseModel(Model):
class Meta:
database = database
class Pub(BaseModel):
...
author = TextField(null=True)
...
publish_date = DateField(null=True)
...
然后,在Pub.select()中迭代条目时,entry.publish\u date
始终是None
,尽管数据库中的所有条目都设置了日期(或至少部分,如year,即类似2016-00-00
)的条目)
(有一个问题,但问题不同:它没有设置,因此解决方案是auto\u now\u add
)
为什么呢?也许格式
是错误的?如何解决这个问题
如何调试这个
一些调试:
我猜peewee
将在引擎盖下使用pymsql
。所以我试着做一件简单的事:
import pymysql
conn = pymysql.connect(...)
cur = conn.cursor()
cur.execute("SELECT publish_date FROM pub")
然后在cur中迭代行,我只会得到行==(无,)
当预先将值强制转换为char
时,它会起作用,也就是说,我将值转换为字符串:
cur.execute("SELECT CAST(publish_date AS char) FROM pub")
我认为这是一个错误了。我报告了这一点。这是一个问题,尽管还不清楚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
虽然还不清楚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