Postgresql sqlalchemy default time now()一次又一次地给出相同的时间

1zmg4dgp  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(138)

我在表里面有一个字段,那就是时间

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个相同的时间,它应该采取时间的权利,现在作为默认选项
知道是什么引起的吗

lpwwtiir

lpwwtiir1#

default=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_time将在每次需要时被调用,并为每个示例返回一个新值。
另请参阅SQLAlchemy文档,了解如何使用Python函数作为默认值。
正如用户Belayer在评论中所暗示的,通常将生成时间戳委托给数据库,而不是在Python中生成它们。在这种情况下,您可以在列上设置server_default属性,例如:

time = db.Column(db.Time, server_default=sqlalchemy.text('NOW()'))


time = db.Column(db.Time, server_default=sqlalchemy.func.now())


数据库端有各种函数可以生成时间戳,它们通常特定于特定的数据库引擎,因此您可能需要研究以找到最适合您需求的函数。

pieyvz9o

pieyvz9o2#

想要添加到@snakecharmerb的答案。sqlalchemy 2.0导入now函数的方法是:

from sqlalchemy.sql.functions import now

字符串
你可以这样使用它:

class Table(Base):
    # any table
    create_ts: Mapped[datetime] = mapped_column(server_default=now())

相关问题