标题说明了一切,但我搞不懂为什么在使用这个SQL炼金术模型时,我得到的创建日期晚于我的更新日期.

我以08:57:53的速度运行这段代码,创建了Said 2023-06-23 08:57:53.000,更新了Said 2023-06-23 07:57:41.670.

我认为这与服务器确定更新时间有关,但我希望它们符合相同的时区.

我在这里错过了什么,因为我非常确定我没有以1小时12秒的速度回到过go ?

class Test(db.Model):
    __tablename__ = 'tests'
    id = db.Column(db.Integer, primary_key=True)
    uuid = db.Column(db.String(36), index=True, default=lambda:str(uuid.uuid4()))
    payload = db.Column(MutableDict.as_mutable(JSONB))
    processed = db.Column(db.Boolean)
    created = db.Column(db.DateTime, default=dt.utcnow(), nullable=False)
    updated = db.Column(db.DateTime, default=dt.utcnow(), onupdate=dt.utcnow(), nullable=False)

有:

session = db.Session()
new_test = Test(
    payload = payload,
    processed = False,
    created = dt.fromtimestamp(processed_timestamp)
)
db.session.add(new_test)
db.session.commit()
db.session.close()

推荐答案

Edit as per the comments

这是因为您将值设置为created和将默认值设置为onupdate的方式.

time.time()返回自纪元以来的时间,但当您返回dt.fromtimestamp(processed_timestamp)时,它将根据您所在的当地时区转换为一个朴素的日期时间,在您的情况下恰好是英国夏令时.

dt.utcnow()返回当前UTC时间,如您所知,BST比UTC早一小时,这解释了您看到的差异.

您必须确保在填充之前使用相同的时区,根据您的应用程序需要使用UTC(utcfromtimestamp)或BST(fromtimestamp).

100

这是因为您在default=dt.utcnow()处调用的是dt.utcnow函数.您很有可能在2023-06-23 07:57:41.670左右开始您的进程,而这是设置为默认值的返回值.

相反,你应该像这样做default=dt.utcnow分而不是()分.

created = db.Column(db.DateTime, default=dt.utcnow, nullable=False)
updated = db.Column(db.DateTime, default=dt.utcnow, onupdate=dt.utcnow, nullable=False)

Sql相关问答推荐

使用group by后我的平均输出不是我想要的

如何在T—SQL中找到值更改之前的日期?

如何使用PostGIS从单个表中 Select 所有相交面组

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

出现5次后,将所有正斜杠替换为连字符

如何根据行状态设置正确的标志

在xml.Modify方法中使用子字符串和可能的替代方法

SQL数据库规范化与数据插入

Snowflake 中的分层数据

从输出中删除 jsonb_build_object

如何在Hive SQL中分别按多列进行分组?

汇总具有连续日期范围的行

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

joins 组合多个重复数据删除策略

Oracle SQL 从多个条件中 Select 但具有相同的 id

如何在 PL/SQL 中区分返回的 XML 值?

PlSql 陷入死循环

如何在一个存储过程中创建全局临时表,并在另一个存储过程中使用它

创建一个将层次 struct 级别放入列中的查询

如何刷新在视图之上创建的表