出于某種原因,在此示例中,可選的 is_active 屬性未設定為默認值。
from pydantic import BaseModel, EmailStr
from datetime import datetime
# Pydantic schemas
# Shared properties
class UserBase(BaseModel):
email: Optional[EmailStr] = None
is_active: Optional[bool] = True
is_superuser: bool = False
username: Optional[str] = None
# Properties to receive via API on creation
class UserCreate(UserBase):
email: EmailStr
password: str
# sqlalchemy model
class User(Base):
id = Column(Integer, primary_key=True, index=True)
username = Column(String(25), index=True, unique=True, nullable=False)
email = Column(String(50), unique=True, index=True, nullable=False)
hashed_password = Column(String(256), nullable=False)
is_active = Column(Boolean(), default=True, nullable=False)
is_superuser = Column(Boolean(), default=False, nullable=False)
__mapper_args__ = {"eager_defaults": True}
我期待 的默認值is_active,作為可選輸入,是 True。但None如果沒有明確通過,我會得到。
obj_in = UserCreate(email=email, password=password, username=username)
print(obj_in.is_active)
# True
db_obj = User(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
username=obj_in.username,
is_superuser=obj_in.is_superuser,
# is_active=obj_in.is_active,
)
print(db_obj.is_active)
# None
# I have to add the is_active flag explicitly
db_obj = User(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
username=obj_in.username,
is_superuser=obj_in.is_superuser,
is_active=obj_in.is_active,
)
print(db_obj.is_active)
# True
uj5u.com熱心網友回復:
事后看來,超級明顯。(不是全部)。有兩個問題:
在實際將其插入資料庫之前,我正在檢查 db_obj 的值。無論出于何種原因,我認為 sqlalchemy 模型回傳的物件
db_obj = User(...)也會分配默認值。原來只有在將物件插入資料庫后才分配默認值。影響我的用例的第二個問題是我沒有重繪 會話。
因此,解決這兩點,我們得到:
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.orm import sessionmaker
engine = create_async_engine(
SQLALCHEMY_DATABASE_URI,
echo=True,
)
# expire_on_commit=False will prevent attributes from being expired
# after commit.
async_session = sessionmaker(
engine, expire_on_commit=False, class_=AsyncSession
)
obj_in = UserCreate(email=email, password=password, username=username)
db_obj = User(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
username=obj_in.username,
is_superuser=obj_in.is_superuser,
# is_active=obj_in.is_active,
)
async with async_session() as session, session.begin():
session.add(db_obj)
await session.flush()
# this assertion fails if above flush is removed.
assert db_obj.is_active == obj_in.is_active
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/388207.html
標籤:Python PostgreSQL的 异步 sqlalchemy 皮丹提克
