【问题标题】:How to generate a UUID field with FastAPI, SQLalchemy, and SQLModel如何使用 FastAPI、SQLalchemy 和 SQLModel 生成 UUID 字段
【发布时间】:2022-01-07 07:57:36
【问题描述】:

在我的 FastAPI 应用程序中创建模型时,我正在努力获取创建 UUID 字段的语法。我正在使用SQLModel

所以基本上,我的 models.py 文件如下所示:

from datetime import datetime
from typing import Optional
import uuid

from sqlalchemy import Column, DateTime
from sqlalchemy.dialects import postgresql as psql
from sqlmodel import SQLModel, Field


class ModelBase(SQLModel):
    """
    Base class for database models.
    """
    id: Optional[int] = Field(default=None, primary_key=True)
    created_at: datetime = Field(sa_column=Column(DateTime(timezone=True), default=datetime.utcnow))
    updated_at: datetime = Field(sa_column=Column(DateTime(timezone=True),
                                 onupdate=datetime.utcnow, default=datetime.utcnow))


class UUIDModelBase(ModelBase, table=True):
    """
    Base class for UUID-based models.
    """
    uuid: uuid.UUID = Field(sa_column=Column(psql.UUID(as_uuid=True)), default=uuid.uuid4)

上面的错误用

AttributeError: 'FieldInfo' object has no attribute 'UUID'

我也试过

id: uuid.UUID = Column(psql.UUID(as_uuid=True), default=uuid.uuid4)
TypeError: Boolean value of this clause is not defined

还有

uuid: uuid.UUID = Column(psql.UUID(as_uuid=True), default=uuid.uuid4)
AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'UUID'

uuid: uuid.UUID = Field(default_factory=uuid.uuid4, index=True, nullable=False)
 AttributeError: 'FieldInfo' object has no attribute 'UUID'

你明白了。这些错误对我没有帮助,我只需要正确的语法。

在这种情况下,我实际上并不想使用 UUID 作为主键。从导入中可以看出,我使用的是 postgreSQL。该数据库基于 postgres:12 docker 映像。

【问题讨论】:

    标签: python postgresql sqlalchemy fastapi sqlmodel


    【解决方案1】:

    解释器可能正在使用您的实际字段uuidUUID,而不是导入的包。因此,您可以将代码更改如下。

    import uuid as uuid_pkg
    
    from sqlalchemy import Field
    from sqlmodel import Field
    
    class UUIDModelBase(ModelBase):
        """
        Base class for UUID-based models.
        """
        uuid: uuid_pkg.UUID = Field(
            default_factory=uuid_pkg.uuid4,
            primary_key=True,
            index=True,
            nullable=False,
        )
    

    参考:https://github.com/tiangolo/sqlmodel/issues/140

    【讨论】:

    • 不错!就是这样:)
    • PostgreSQL v13+ 也支持gen_random_uuid() ,所以你可以拥有server_default="gen_random_uuid()"。在此之前只能作为 PostgreSQL 扩展使用。
    • 试过这个来解决here 描述的问题,但它没有用。有什么想法吗?
    猜你喜欢
    • 2022-12-08
    • 1970-01-01
    • 2022-11-15
    • 2021-04-15
    • 2021-12-31
    • 1970-01-01
    • 2010-09-16
    • 2022-08-11
    • 2017-06-24
    相关资源
    最近更新 更多