SQLAlchemy 隐式类型转换和日期验证
SQLAlchemy implicit type conversion and Date validation
让我们假设这个模型 class:
class Person(db.Model):
__tablename__ = "person"
date_of_birth = db.Column(db.Date)
由于 person
是 Person
的实例,我可以在单元测试中执行以下操作:
person.date_of_birth = "05/05/2000"
到目前为止一切顺利,此代码已经投入生产一段时间了。现在有人报告一个错误,有人的出生日期在未来。未来的出生日期在我的上下文中是无效的,我想阻止它们进入数据存储,所以我向模型添加了一个验证器 class:
@validates("date_of_birth")
def validate_date_of_birth(self, key, date_of_birth):
if date_of_birth and date_of_birth > datetime.now().date():
raise BirthDayException("A date of birth must not be in the future.")
return date_of_birth
这在某种程度上可以理解,当我从上面进行分配时,这会破坏我的单元测试并抛出异常:
> if date_of_birth and date_of_birth > datetime.datetime.now().date():
E TypeError: '>' not supported between instances of 'str' and 'datetime.date'
虽然我不太明白我应该在哪里解决它。
- 我是否应该更改我的单元测试而不是将字符串值分配给日期
属性?但是代码中可能还有其他地方
发生了,让我暴露在回归中。
- 或者我应该检查一下
验证器中的正确数据类型并在必要时转换它?
- 或者我能以某种方式告诉 SqlAlchemy 进行自动转换吗?
通常在验证器被调用之前?那将是
最好的解决方案。
感谢您的意见。
Fwiw,我最终做了一件不可思议的事情——检查类型并转换为日期,如果它是一个字符串:
if type(date_of_birth) is str:
date_of_birth = datetime.datetime.strptime(date_of_birth, "%m/%d/%Y").date()
if date_of_birth and date_of_birth > datetime.datetime.now().date():
raise BirthDayException("A date of birth must not be in the future.")
让我们假设这个模型 class:
class Person(db.Model):
__tablename__ = "person"
date_of_birth = db.Column(db.Date)
由于 person
是 Person
的实例,我可以在单元测试中执行以下操作:
person.date_of_birth = "05/05/2000"
到目前为止一切顺利,此代码已经投入生产一段时间了。现在有人报告一个错误,有人的出生日期在未来。未来的出生日期在我的上下文中是无效的,我想阻止它们进入数据存储,所以我向模型添加了一个验证器 class:
@validates("date_of_birth")
def validate_date_of_birth(self, key, date_of_birth):
if date_of_birth and date_of_birth > datetime.now().date():
raise BirthDayException("A date of birth must not be in the future.")
return date_of_birth
这在某种程度上可以理解,当我从上面进行分配时,这会破坏我的单元测试并抛出异常:
> if date_of_birth and date_of_birth > datetime.datetime.now().date():
E TypeError: '>' not supported between instances of 'str' and 'datetime.date'
虽然我不太明白我应该在哪里解决它。
- 我是否应该更改我的单元测试而不是将字符串值分配给日期 属性?但是代码中可能还有其他地方 发生了,让我暴露在回归中。
- 或者我应该检查一下 验证器中的正确数据类型并在必要时转换它?
- 或者我能以某种方式告诉 SqlAlchemy 进行自动转换吗? 通常在验证器被调用之前?那将是 最好的解决方案。
感谢您的意见。
Fwiw,我最终做了一件不可思议的事情——检查类型并转换为日期,如果它是一个字符串:
if type(date_of_birth) is str:
date_of_birth = datetime.datetime.strptime(date_of_birth, "%m/%d/%Y").date()
if date_of_birth and date_of_birth > datetime.datetime.now().date():
raise BirthDayException("A date of birth must not be in the future.")