wad*_*081 2 python postgresql sqlalchemy flask-sqlalchemy
我的表内有一个字段,即时间
time = db.Column(db.Time, default=datetime.datetime.now().time(), nullable=False)
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它一直默认为同一时间而不是实际的系统时间
"23:53:27.34808"
"20:10:29.613031"
"20:10:29.65371"
"20:10:29.230696"
"20:10:29.613031"
"01:40:41.962449"
"20:10:29.375499"
"09:48:38.981206"
"10:42:38.56931"
"10:42:38.56931"
"10:42:38.56931"
"10:42:38.541895"
"10:42:38.56931"
"10:42:38.56931"
"10:42:38.56931"
"05:01:44.076726"
"10:42:38.56931"
"15:15:18.271026"
"07:29:20.49368"
"15:15:18.271026"
"15:15:18.271026"
Run Code Online (Sandbox Code Playgroud)
如果你查看时间,有 4 或 5 个相同的时间,并且默认选项现在应该需要一些时间
有什么想法可能导致它吗?
default=datetime.datetime.now().time()
将在导入时评估一次,导致所有实例的观察到的行为被分配相同的值。
提供 Python 函数作为默认值时,通常的解决方案是提供函数对象:
Column(..., default=func, ...)
Run Code Online (Sandbox Code Playgroud)
但在本例中,涉及两个函数调用 (.now()
和.time()
),因此解决方案是定义一个执行这两项操作的函数(或 lambda):
def default_time():
# Python 3.12+: datetime.datetime.now(tz=datetime.UTC).time()
return datetime.datetime.now().time()
...
time = db.Column(db.Time, default=default_time, nullable=False)
Run Code Online (Sandbox Code Playgroud)
使用这种方法,default_time
每次需要时都会被调用,并为每个实例返回一个新值。
另请参阅有关使用 Python 函数作为默认值的SQLAlchemy文档。
正如用户 Belayer 在评论中暗示的那样,通常将生成时间戳委托给数据库,而不是在 Python 中生成它们。在这种情况下,您可以在列上设置server_default属性,例如如下所示:
time = db.Column(db.Time, server_default=sqlalchemy.text('NOW()'))
Run Code Online (Sandbox Code Playgroud)
或者
time = db.Column(db.Time, server_default=sqlalchemy.func.now())
Run Code Online (Sandbox Code Playgroud)
数据库端有各种函数可以生成时间戳,并且它们通常特定于特定的数据库引擎,因此您可能需要研究以找到最适合您需求的函数。
归档时间: |
|
查看次数: |
4768 次 |
最近记录: |