Peewee 使用Peewee时,我有一个默认为datetime.datetime.now()的datetime字段。但是在插入时,它会取服务器启动时的时间。为什么呢
在本文中,我们将介绍Peewee中datetime字段的默认值设置以及默认值在插入数据时的行为。我们还将通过示例说明为什么在插入数据时默认值会取服务器启动时的时间。
阅读更多:Peewee 教程
Peewee中datetime字段的默认值设置
在Peewee中,可以通过字段的default参数来设置默认值。对于datetime字段,可以使用datetime.datetime.now()来设置当前时间作为默认值。例如:
from peewee import *
import datetime
database = SqliteDatabase('my_database.db')
class MyModel(Model):
timestamp = DateTimeField(default=datetime.datetime.now)
class Meta:
database = database
在上面的示例中,我们定义了一个名为timestamp的datetime字段,并将默认值设置为当前时间datetime.datetime.now()。
默认值在插入数据时的行为
默认情况下,Peewee在插入数据时会将默认值赋给相应的字段,除非指定了相应字段的值。然而,在使用datetime.datetime.now()作为默认值时,Peewee在插入数据时会有特殊行为。
当使用datetime.datetime.now()作为默认值时,它是一个可调用对象,它会在每次创建新记录时被调用以生成默认值。但是,这个默认值是在创建模型类时生成的,即在服务器启动时生成,并不会在每次插入数据时重新生成。
为了更好地理解这个问题,考虑以下示例:
from peewee import *
import datetime
database = SqliteDatabase('my_database.db')
class MyModel(Model):
timestamp = DateTimeField(default=datetime.datetime.now())
class Meta:
database = database
database.create_tables([MyModel])
# 创建第一条记录
record1 = MyModel.create()
print(record1.timestamp) # 输出服务器启动的时间
# 创建第二条记录
record2 = MyModel.create()
print(record2.timestamp) # 依然输出服务器启动的时间
在上面的示例中,我们创建了一个名为MyModel的模型类,其中包含一个名为timestamp的datetime字段,其默认值为datetime.datetime.now()。创建了两条记录,但是它们的timestamp字段的值都是服务器启动时的时间,而不是每次创建记录时的时间。
这是因为在创建模型类时,Peewee会调用datetime.datetime.now()来生成默认值。然后,这个默认值会被应用于每次插入数据时的相应字段。由于默认值在模型类创建时生成,并不会在每次插入时重新生成,导致了这个问题。
如果希望每次插入数据时都使用当前时间作为默认值,可以通过自定义一个函数来实现。例如:
from peewee import *
import datetime
database = SqliteDatabase('my_database.db')
def get_current_datetime():
return datetime.datetime.now()
class MyModel(Model):
timestamp = DateTimeField(default=get_current_datetime)
class Meta:
database = database
database.create_tables([MyModel])
# 创建第一条记录
record1 = MyModel.create()
print(record1.timestamp) # 输出当前时间
# 创建第二条记录
record2 = MyModel.create()
print(record2.timestamp) # 输出当前时间
在上面的示例中,我们定义了一个名为get_current_datetime的函数,该函数返回当前时间。然后,我们将该函数作为默认值传递给DateTimeField的default参数。这样,每次插入数据时都会调用该函数来获取当前时间作为默认值。
总结
在Peewee中,当使用datetime.datetime.now()作为datetime字段的默认值时,该默认值是在创建模型类时生成的,即在服务器启动时生成。这导致在插入数据时默认值取服务器启动时的时间而不是每次插入数据时的时间。为了解决这个问题,可以通过自定义一个函数并将其作为默认值来获取每次插入数据时的当前时间。
极客笔记