SqlModel 日期时间字段在执行时抛出错误

SqlModel datetime field is throwing error upon execution

我在 python 3.8

中使用 SQLModel

当我添加日期时间字段时 created_at: datetime = Field(default_factory=utcnow(), nullable=False)

我明白了 错误

File "./app/main.py", line 16, in <module>
    class Post(SQLModel, table=True):
  File "/Users/markwardell/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/sqlmodel/main.py", line 277, in __new__
    new_cls = super().__new__(cls, name, bases, dict_used, **config_kwargs)
  File "pydantic/main.py", line 204, in pydantic.main.ModelMetaclass.__new__
  File "pydantic/fields.py", line 488, in pydantic.fields.ModelField.infer
  File "pydantic/fields.py", line 419, in pydantic.fields.ModelField.__init__
  File "pydantic/fields.py", line 539, in pydantic.fields.ModelField.prepare
  File "pydantic/fields.py", line 801, in pydantic.fields.ModelField.populate_validators
  File "pydantic/validators.py", line 718, in find_validators
RuntimeError: error checking inheritance of <module 'datetime' from '/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/datetime.py'> (type: module)

如果我不添加 created_at,则会按预期在 PostgresSql 中创建 table。 代码

import datetime
from typing import Optional
import utcnow as utcnow
from fastapi import FastAPI
from sqlalchemy import TIMESTAMP, text
from sqlmodel import Field, Session, SQLModel, create_engine, select
from app.database import SQLALCHEMY_DATABASE_URL

class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str = Field(index=True)
    secret_name: str
    age: Optional[int] = Field(default=None, index=True)


class Post(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True, nullable=False)
    title: str = Field(nullable=False)
    content: str = Field(nullable=False)
    published: bool = Field(default=True, nullable=False)
    created_at: datetime = Field(default_factory=utcnow(), nullable=False)

engine = create_engine(SQLALCHEMY_DATABASE_URL)


def create_db_and_tables():
    SQLModel.metadata.create_all(engine)


app = FastAPI()


@app.on_event("startup")
def on_startup():
    create_db_and_tables()

这已在评论中进行了解释,但只是将其添加为其他人的答案:

您必须像这样导入日期时间

from datetime import datetime

我们在此上下文中需要的 datetime 实际上是模块内部的 class,也称为 datetime

另外,请注意您的代码应该是

created_at: datetime.datetime = Field(default_factory=datetime.utcnow, nullable=False)

不在实例化时调用 utcnow,这样做会给出实例化时查询的每个条目日期时间。因此,default_factory 应该是函数,而不是值。