我在一个Python应用程序中使用SQLModel ORM框架,在try 将新记录插入到PostgreSQL数据库时,遇到了与DateTime对象相关的TypeError.

from datetime import datetime, timezone
import uuid
from sqlmodel import Field, SQLModel, Relationship, UniqueConstraint
from typing import List

class UserBase(SQLModel):
    id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
    phone_number: str = Field(max_length=255)
    phone_prefix: str = Field(max_length=10)

class User(UserBase, table=True):
    __table_args__ = (
        UniqueConstraint("phone_number", "phone_prefix", name="phone_numbe_phone_prefix_constraint"),
    )
    registered_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
    interests: List["Interest"] = Relationship(back_populates="user")

try 插入新的User记录时,遇到以下错误:

E   TypeError: can't subtract offset-naive and offset-aware datetimes

asyncpg/pgproto/./codecs/datetime.pyx:152: TypeError

上述异常是以下异常的直接原因:

self = <sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_cursor object at 0x108b78ee0>
operation = 'INSERT INTO "user" (id, phone_number, phone_prefix, registered_at) VALUES ($1::UUID, $2::VARCHAR, $3::VARCHAR, $4::TIMESTAMP WITHOUT TIME ZONE)'
parameters = ('d9999373-a43d-4154-935c-f28f13f17d3e', '8545227945', '+342', datetime.datetime(2024, 2, 29, 18, 25, 54, 21935, tzinfo=datetime.timezone.utc))

如何解决此TypeError以确保SQLModel中的时区感知日期时间对象之间的兼容性?

推荐答案

问题是,默认情况下,sqlmodel中的任何datetime都是不知道时区的:

    registered_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))

因此,在插入时区感知的datetime(如datetime.now(timezone.utc))时,您会遇到问题.解决方案是将该字段声明为时区感知(未经测试,based on this Github issue):

import sqalchemy as sa

...

    registered_at: datetime = Field(
        # Add this parameter
        sa_column=sa.Column(sa.DateTime(timezone=True), nullable=False),
        default_factory=lambda: datetime.now(timezone.utc)
    )

Python相关问答推荐

如何删除索引过go 的lexsort深度可能会影响性能?' &>

SQLAlchemy Like ALL ORM analog

python中字符串的条件替换

在Django admin中自动完成相关字段筛选

Pandas Loc Select 到NaN和值列表

Python逻辑操作作为Pandas中的条件

Plotly Dash Creating Interactive Graph下拉列表

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

需要帮助重新调整python fill_between与数据点

如何从列表框中 Select 而不出错?

为什么if2/if3会提供两种不同的输出?

为什么Python内存中的列表大小与文档不匹配?

提取数组每行的非零元素

按条件计算将记录拆分成两条记录

使用xlsxWriter在EXCEL中为数据帧的各行上色

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

Groupby并在组内比较单独行上的两个时间戳

在使用ROLING()获得最大值时,是否可以排除每个窗口中的前n个值?

根据边界点的属性将图划分为子图

如何使用count()获取特定日期之间的项目