gpt4 book ai didi

python - 在 Flask-SQLAlchemy 中自动格式化 db.Datetime 值

转载 作者:行者123 更新时间:2023-11-29 06:50:27 26 4
gpt4 key购买 nike

我正在迁移主机,新主机使用较新版本的 MySQL,该版本对其接受的日期时间值的格式更加严格。我知道我可以将其关闭,但我想找到一种解决方案来将这些值正确转换为正确的格式。最好是可以在我需要更新的许多模型(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)

我希望有一种方法可以修改 db.Datetime,以便在提供 ISO8601 日期时间字符串 ('YYYY-MM-DDT00:00:00.000Z') 时返回真正的 Python 日期时间对象

寻找类似的东西:

class FormattedDateTime(db.DateTime):
def self.__set__(self, value):
return dateutil.parser.parse(value)

列定义将更改为:

updated = db.Column(FormattedDateTime)

...这样当SQLAlchemy发送到MySQL时会自动以正确的格式保存。

我查看了 Mixins 并搜索了可以实现此目的的方法,但似乎找不到任何好的解决方案。非常感谢您的帮助。

更新:这是我迄今为止所制定的草稿...即使在查询中的字段上进行过滤/比较时,它似乎也表现良好,但尚未经过充分测试。

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

最佳答案

我很惊讶内置的 DateTime 类型不会自动为数据库提供有效值 - 这可能是 SQLAlchemy 中的一个错误?

也就是说,创建自定义类型可能会满足您的要求 - 有一个 few examples in the SQLAlchemy docs ,但是这样的事情应该可以帮助您开始:

import datetime
from sqlalchemy.types import TypeDecorator, TIMESTAMP
import iso8601

class ISO8601DateTime(TypeDecorator):
impl = TIMESTAMP

def process_bind_param(self, value, dialect):
if value is None:
return None

if isinstance(value, datetime.datetime):
return value.strftime(<iso8601-format-string>)

return value

def process_result_value(self, value, dialect):
if value is None:
return None

return iso8601.parse_date(value)

使用iso8601为简洁起见,lib,date-util可能有必要。您可能还需要对时间戳/日期时间使用特定于方言的类型。

关于python - 在 Flask-SQLAlchemy 中自动格式化 db.Datetime 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47717840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com