首页 > 编程问答 >使用“marshmallow-sqlalchemy”时发生错误,异常:反序列化需要会话

使用“marshmallow-sqlalchemy”时发生错误,异常:反序列化需要会话

时间:2024-07-29 11:36:08浏览次数:10  
标签:python marshmallow marshmallow-sqlalchemy

使用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}

解释:

  1. 使用 dump 方法: 我们使用 UserSchema().dump(user_dict) 将 SQLAlchemy 对象 user_dict 转换为 Python 字典 user_data
  2. dump_only=True : UserSchema 中,我们将 id 字段设置为 dump_only=True ,这意味着该字段只在序列化(dump)时使用,而在反序列化(load)时忽略。

通过这些修改,的代码应该可以正常工作并避免 "反序列化需要会话" 的错误。

标签:python,marshmallow,marshmallow-sqlalchemy
From: 78805309

相关文章

  • Python环境:深入理解与构建实践
    Python环境:深入理解与构建实践在当今的软件开发领域中,Python以其简洁的语法、丰富的库支持和广泛的应用场景,成为了众多开发者、数据科学家、机器学习工程师及自动化测试人员的首选语言。然而,要高效地使用Python进行项目开发,深入理解并合理构建Python环境是至关重要的。本文......
  • 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便
    自动化测试中,QTP和seleniumIDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制。个人觉得传统录制工具有些弊端,加上要定制支持我自己的自动化框架(python单机版自动化测试框架源代码),所以自己用javascript写了一个......
  • Python 面试常问问题及应用场景解析
    引言随着Python在数据科学、Web开发、自动化脚本、机器学习等领域中的广泛应用,越来越多的公司开始寻找具备Python技能的人才。因此,在Python面试中,面试官通常会通过一系列问题来评估应聘者的编程基础、问题解决能力和对Python特性的理解程度。本文将涵盖Python面试中最常见的......
  • python 虚拟环境
    python虚拟环境Python的venv模块允许你创建轻量级的“虚拟环境”,这些环境是独立的Python安装,用于项目的依赖隔离。每个虚拟环境都有自己的Python解释器、库和脚本,与系统中安装的Python相互隔离。这意呀着,你可以在一个项目中安装特定版本的库,而不会影响到系统上其他Pyt......
  • 使用 Azure Devops API (Python) 撰写 PR 评论
    在任何地方都找不到直接的方法。如何通过Python中的AzureDevopsAPI将注释添加到拉取请求?可以使用AzureDevOpsPythonAPI将注释添加到拉取请求。以下是执行此操作的方法:1.安装AzureDevOps库:pipinstallazure-devops2.导入必要的类并对的组......
  • Python\Python312\Lib\site-packages\torch\lib\fbgemm.dll
    在此处输入图像描述我正在尝试从HuggingFace导入GPT-2变压器模型,但当我尝试导入它时,遇到错误。即使当我尝试仅导入Torch时,我也会收到相同的错误。我已尝试重新安装Torch并完成了所有操作,包括更新VisualC++Redistributable软件包和更新我的驱动程序,但问题......
  • Python GEKKO 不更新参数
    我正在Python中使用GEKKO来估计弹跳球的轨迹。为此,我需要估计2个变量:e_1(恢复系数)和q_1(每次弹跳时的水平速度损失)。我已为其编写了以下代码,但参数似乎没有更新,尽管解算器已成功执行。参数的初始值与参数的最终优化值相同e_1=0.8和q_1=1代码:imp......
  • Python内置模块常用总结
    目录unittestunittest点击查看代码importunittestfromhtmltestreportimportHTMLTestReportclassTestOne(unittest.TestCase):@classmethoddefsetUpClass(cls)->None:print(f'setUpClass')@classmethoddeftearDownClass......
  • 使用 warpPerspective 生成​​全景图像并使用 python 进行单应拼接
    我没有获得正确的全景图像,并且图像质量随着图像的缝合而降低。我期待获得正确的360度图像,并且不会因正确拼接而降低质量。当我使用网络摄像头图像时。它应该得到没有不匹配的拼接图像。我正在研究匹配FCFS中的图像或最佳匹配的方法。创建并添加一个输入图像以及image1和im......
  • 通过 python 获取 android.view.ViewGroup 中的子项
    是否可以使用python、adb或任何库从android.view.ViewGroup获取子元素或文本,但不需要java和kotlin?我正在尝试使用python自动化android模拟器。与模拟器的交互通过adb进行。当我得到屏幕转储时,我看到我需要的元素是android.view.ViewGroup,并且text和content-......