使用marshmallow-sqlalchemy反序列化对象,但出现错误。我已经通过了session对象,也就是数据库DB,但是还是没有效果,这个问题已经2天了,依然无法解决。
my_db.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
DATABASE_URL = "mysql+pymysql://root:Cfzy2018!@xxxxx:xxxx/fastapi"
engine = create_engine(DATABASE_URL, echo=True)
SessionLocal = sessionmaker(
bind=engine,
autocommit=False,
autoflush=False,
expire_on_commit=False
)
my_session = scoped_session(SessionLocal)
Base = declarative_base()
Base.metadata.create_all(bind=engine)
def get_db():
session_db = my_session()
try:
yield session_db
except Exception as e:
logger.error("Exception info: %s", str(e))
session_db.rollback()
raise e
finally:
session_db.close()
song.py
@app.post("/create_song_sheet/")
async def create_song_sheet(request: Request, db: Session = Depends(get_db)):
user_dict = request.state.user # user_dict_data
user: UserDB = UserSchema().load(user_dict, session=db)
# other code
return {"status": "success", "data": user}
my_schemas.py|| |class SongSchema(SQLAlchemySchema):
我的代码应该可以工作,但我不知道问题是什么。
class Meta:
model = SongDB
load_instance = True
include_relationships = True
My code should be working, but I don't know what the problem is.
问题出在使用
load
方法反序列化
user_dict
数据,但
load
方法用于将原始数据(如字典)加载到新的 ORM 对象实例中,而已经拥有用户数据。
在的情况下,应该使用
marshmallow-sqlalchemy
的
dump
方法将 SQLAlchemy 对象序列化为 Python 数据结构(如字典)。
以下是修改后的代码:
from marshmallow_sqlalchemy import SQLAlchemySchema, auto
from marshmallow import fields
# my_schemas.py
class UserSchema(SQLAlchemySchema):
class Meta:
model = UserDB
load_instance = True
id = auto(dump_only=True)
username = fields.String()
# ... other fields
# song.py
@app.post("/create_song_sheet/")
async def create_song_sheet(request: Request, db: Session = Depends(get_db)):
user_dict = request.state.user
# 使用dump方法序列化用户数据
user_data = UserSchema().dump(user_dict)
# other code using user_data
return {"status": "success", "data": user_data}
解释:
-
使用
dump
方法: 我们使用UserSchema().dump(user_dict)
将 SQLAlchemy 对象user_dict
转换为 Python 字典user_data
。 -
dump_only=True
: 在UserSchema
中,我们将id
字段设置为dump_only=True
,这意味着该字段只在序列化(dump)时使用,而在反序列化(load)时忽略。
通过这些修改,的代码应该可以正常工作并避免 "反序列化需要会话" 的错误。
标签:python,marshmallow,marshmallow-sqlalchemy From: 78805309