default=datetime.datetime.now().time()
将在导入时评估一次,导致所有实例的观察到的行为被分配相同的值。
提供 Python 函数作为默认值时,通常的解决方案是提供函数对象:
default=func, ....
但在这种情况下,涉及两个函数调用(.now()
and .time()
),所以解决方案是定义一个执行以下两项操作的函数(或 lambda):
def default_time():
return datetime.datetime.now().time()
...
time = db.Column(db.Time, default=default_time, nullable=False)
使用这种方法,default_time
每次需要时都会被调用,并为每个实例返回一个新值。
另请参阅 SQLAlchemy有关使用 Python 函数作为默认值的文档.
正如用户 Belayer 在中暗示的那样comments,通常将生成时间戳委托给数据库而不是在 Python 中生成它们。在这种情况下,您将设置服务器默认值列上的属性,例如这样:
time = db.Column(db.Time, server_default=sqlalchemy.text('NOW()'))
or
time = db.Column(db.Time, server_default=sqlalchemy.func.now())
数据库端有各种函数可以生成时间戳,并且它们通常特定于特定的数据库引擎,因此您可能需要研究以找到最适合您需求的函数。