Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Postgresql sqlalchemy default time now()反复给出相同的时间_Python_Postgresql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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())