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
应该是函数,而不是值。
我在 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
应该是函数,而不是值。