【问题标题】:SqlModel datetime field is throwing error upon executionSqlModel 日期时间字段在执行时抛出错误
【发布时间】:2022-02-02 00:22:50
【问题描述】:

我在 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 中创建。 代码

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
  • @KlausD。修复它。如果您喜欢添加为答案,我将使用已回答的复选标记。非常感谢!

标签: python datetime fastapi sqlmodel


【解决方案1】:

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

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

from datetime import datetime

在这种情况下,我们需要的 datetime 实际上是模块内的一个类,也称为 datetime

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2020-10-18
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多