Python Postgresql sqlalchemy default time now()反复给出相同的时间
我在桌子里面有一个字段,就是时间Python Postgresql sqlalchemy default time now()反复给出相同的时间,python,postgresql,sqlalchemy,flask-sqlalchemy,Python,Postgresql,Sqlalchemy,Flask Sqlalchemy,我在桌子里面有一个字段,就是时间 time = db.Column(db.Time, default=datetime.datetime.now().time(), nullable=False) 由于某些原因,它会在同一时间而不是实际的系统时间上保持默认值 "23:53:27.34808" "20:10:29.613031" "20:10:29.65371" "20:10:29.230696" "20:
time = db.Column(db.Time, default=datetime.datetime.now().time(), nullable=False)
由于某些原因,它会在同一时间而不是实际的系统时间上保持默认值
"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"
如果你看时间,有4或5个相同的时间,它应该需要时间作为默认选项
是否知道是什么原因导致了这种情况?默认值=datetime.datetime.now().time()将在导入时计算一次,从而导致所有实例的观察行为都被赋予相同的值 默认提供Python函数时,通常的解决方案是提供函数对象:
default=func, ....
但在本例中,涉及两个函数调用(.now()
和.time()
),因此解决方案是定义一个函数(或lambda)来执行这两个功能:
def default_time():
return datetime.datetime.now().time()
...
time = db.Column(db.Time, default=default_time, nullable=False)
使用这种方法,每次需要时都会调用default\u time
,并为每个实例返回一个新值
另请参见SQLAlchemy
正如用户Belayer在中所暗示的,通常将生成时间戳的任务委托给数据库,而不是在Python中生成时间戳。在这种情况下,可以在列上设置属性,例如:
time = db.Column(db.Time, server_default=sqlalchemy.text('NOW()'))
或
数据库端有各种函数可以生成时间戳,它们通常特定于特定的数据库引擎,因此您可能需要研究以找到最适合您需要的函数。我不知道SQLAlchemy,因此我不知道您是否可以使用以下函数。在straight Postgres中,now()将为每个事务调用一次,如果这还不够,那么您可以使用@Belayer,通过设置列的属性来执行此操作。在Postgres中,您可以直接将列定义为“created_at timestamp非空默认时钟_timestamp()”。在炼金术中会是怎样的,我也不知道。我检查了你的链接,我没有看到任何阻止它的东西,不幸的是没有什么特别允许它。
time = db.Column(db.Time, server_default=sqlalchemy.func.now())