我正在迁移主机,新主机使用更新版本的MySQL,它对接受的datetime值的格式要求更严格。我知道我可以关闭它,但我想找到一个解决方案,将这些值正确地转换为正确的格式。最好是一个可以很容易地在我需要更新的许多模型之间交换(100个左右)。在
如果我找不到在模型级别上更新它的方法,我可能需要查找设置这些值的数千个位置。在
我在这里裁剪了一个示例模型:class Timesheet(BaseModel, db.Model):
__tablename__ = "timesheet"
timesheet_id = db.Column(db.Integer, primary_key=True)
created = db.Column(db.DateTime, default=datetime.utcnow)
updated = db.Column(db.DateTime)
employee_id = db.Column(db.Integer, db.ForeignKey('user.employee_id'))
description = db.Column(db.String(255))
hours = db.Column(db.Numeric(9, 2))
billable = db.Column(db.Boolean, default=False)
retainer = db.Column(db.Boolean, default=False)
client_id = db.Column(db.Integer, db.ForeignKey('client.client_id'), default=None)
project_id = db.Column(db.Integer, db.ForeignKey('project.project_id'), default=None)
task_id = db.Column(db.Integer, default=None)
timesheet_date = db.Column(db.DateTime, default=datetime.utcnow)
我希望有办法修改数据库日期时间因此,当提供ISO8601日期时间字符串('YYYY-MM-DDT00:00:00.000Z')时,它将返回一个真正的Python datetime对象
从以下方面寻找:
^{pr2}$
然后,列定义将更改为:updated = db.Column(FormattedDateTime)
…这样当SQLAlchemy发送到MySQL时,它将自动以正确的格式保存。在
我研究过mixin并四处寻找可以实现这一目标的方法,但似乎找不到任何好的解决方案。非常感谢帮助。在
更新:
这是我到目前为止所做的工作的草稿。。。即使在查询中对字段进行过滤/比较时,它似乎也能很好地运行,但还没有得到很好的测试。在class TFDateTime(TypeDecorator):
impl = DATETIME
def process_bind_param(self, value, dialect):
if value is None:
return None
print("process_bind_param", value, type(value))
if type(value) == datetime or type(value) == date:
return value
elif type(value) == str:
return parse(value, ignoretz=True)
else:
return None
def process_result_value(self, value, dialect):
if value is None:
return None
print("process_result_value", value, type(value))
return value