SQLAlchemy 模型中数据的错误表示

在这里插入图片描述

1. 问题背景

  • 在使用 SQLAlchemy 0.6.0 版本(也曾尝试使用 0.6.4 版本)的 Pylons 应用程序中遇到了一个 SQLAlchemy ORM 问题。
  • 该问题出现在使用 psycopg2 作为数据库驱动程序、连接至 Postgresql 8.2 数据库的环境中。
  • 定义了一个 User 模型对象,其中包含以下属性:
class User(Base):
    __tablename__ = 'users'

    __table_args__ = (saschema.UniqueConstraint("login", "company_id"), {})

    __mapper_args__ = {
      'order_by' : 'lower(users.name)',
      }

    user_id = Column(Integer, primary_key=True)
    email = Column(String)
    login = Column(String)
    company_id = Column(String, ForeignKey('company.company_id'))
  • 尝试使用以下代码更新 User 模型的实例:
def do_update(user_id):
    existing = Session().query(User).filter_by(user_id=user_id).one()

    for field in ('login', 'email', 'name', 'is_admin_user'): # only email changes; it's set to "" from "foo@bar.com"
        if field in params:
            setattr(existing, field, params[field])

    if 'advanis_portal_user_id' in params:
        if not existing.portal_link:
            existing.portal_link = UserPortalLink()
        existing.portal_link.advanis_portal_user_id = params['advanis_portal_user_id']

    if 'password' in params and existing.password:
        existing.password.password = Password.encrypt(existing.login, params['password'])

    UserValidator(existing) # raises an exception
    self._commit()
    return existing
  • 当电子邮件地址从 “foo@bar.com” 变更为 “” 时,UserValidator 会引发异常,随后,即使 Pylons 服务器重启,通过以下查询返回的用户电子邮件地址仍为空白:
Session().query(User).filter_by(login=login, company_id=company).one()
Session().query(User).all()
  • 通过以下查询可以返回电子邮件地址完整的用户:
Session().query(User).filter_by(user_id=user_id).one()

2. 解决方案

问题的原因是当电子邮件字段被设置为 “” 时,SQLAlchemy ORM 不会将该更改持久化到数据库中。这可能是由于在设置电子邮件字段为空字符串之前没有调用 session.flush() 方法造成的。调用 session.flush() 方法可以将未提交的更改写入到数据库中,从而确保当对数据库发出查询时可以获取到最新的数据。

为了解决这个问题,需要在代码中调用 session.flush() 方法,如下所示:

def do_update(user_id):
    existing = Session().query(User).filter_by(user_id=user_id).one()

    for field in ('login', 'email', 'name', 'is_admin_user'): # only email changes; it's set to "" from "foo@bar.com"
        if field in params:
            setattr(existing, field, params[field])

    if 'advanis_portal_user_id' in params:
        if not existing.portal_link:
            existing.portal_link = UserPortalLink()
        existing.portal_link.advanis_portal_user_id = params['advanis_portal_user_id']

    if 'password' in params and existing.password:
        existing.password.password = Password.encrypt(existing.login, params['password'])

    UserValidator(existing) # raises an exception

    # Add this line to flush the changes to the database
    session.flush()

    self._commit()
    return existing

调用 session.flush() 方法后,当对数据库发出查询时,就可以获取到最新的数据了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/683771.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专为成长型企业打造的Java CRM系统源码:CRM客户关系管理系统技术解析与功能构建

一、序章 在激烈的市场竞争环境中,客户关系管理(CRM)系统是企业保持竞争优势、提高客户满意度、推动业务发展的核心工具。本文将深入探讨一款集成了现代技术的CRM系统,该系统基于Spring Cloud Alibaba与Spring Boot构建&#xff…

关于安装typescript后运行tsc -v命令报错问题

报错信息: tsc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 没有配置环境变量,使用npm命令查看typescript的安装目录: npm config get prefix 根据控制台输出的目录,配置path环境变量 tsc -v 运行成功&…

申请医疗设备注册变更时,需要补充考虑网络安全的情况有哪些?

在申请医疗器械设备注册变更时,需要补充网络安全的情况主要包括以下几点: 网络安全功能更新:如果医疗器械的自研软件发生网络安全功能更新,或者合并网络安全补丁更新的情形,需要单独提交一份自研软件网络安全功能更新…

计算机网络 期末复习(谢希仁版本)第1章

大众熟知的三大网络:电信网络、有线电视网络、计算机网络。发展最快起到核心的是计算机网络。Internet是全球最大、最重要的计算机网络。互联网:流行最广、事实上的标准译名。互连网:把许多网络通过一些路由器连接在一起。与网络相连的计算机…

DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)

场景 DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑: DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑_jenkins的安装以及集成jdkgitmaven 提示警告-CSDN博客 Windows10(家庭版…

基于centos7打包当前环境的系统为iso镜像文件

1. 准备工作 1.下载安装mondo 切换到root用户,进入yum下载库 # cd /etc/yum.repos.d # wget ftp://ftp.mondorescue.org/centos/7/x86_64/mondorescue.repo 打开文件mondorescue.repo,修改gpgcheck属性为0,指定mondorescue.repo安装 # 安…

Java 8 中的 Stream API,用于处理集合数据

Java 8 引入了 Stream API,使得处理集合数据变得更加简洁和高效。Stream API 允许开发者以声明式编程风格操作数据集合,而不是使用传统的迭代和条件语句。 一、基本概念 1.1 什么是 Stream Stream 是 Java 8 中的一个新抽象,它允许对集合数…

先进制造aps专题十一 国内软件/erp行业的现状及对aps行业的启示

看到一个帖子 中国软件行业几乎全军覆没 OSC开源社区 2024-06-03 15:58 广东 刚刚网上冲浪刷到的 网友锐评:都是客户关系型公司。 知名大 V 「Fenng」评论称: 这里所谓的软件行业公司如果立刻倒闭,才能够利好中国整个行业软件生态。有个网…

【云原生】Kubernetes----RBAC用户资源权限

目录 引言 一、Kubernetes安全机制概述 二、认证机制 (一)认证方式 1.HTTPS证书认证 1.1 证书颁发 1.2 config文件 1.3 认证类型 1.4 Service Account 1.4.1 作用 1.4.2 包含内容 1.4.3 与Secret的关系 2.Bearer Tokens 3.基本认证 三、鉴…

【Java数据结构】二叉树详解(四)

🔒文章目录: 1.❤️❤️前言~🥳🎉🎉🎉 2.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 2.1第一种思路 2.2第二种思路 3.根据一棵树的前序遍历与中序遍历构造二叉树 4.根据一棵树的中序…

短视频外卖平台区域代理怎么拿?两种方法!

抖音外卖平台区域代理怎么拿?市面上只有两种途径可走。没有其他任何方法。 一是拿抖音官方区域服务商身份,第一个要求是保证金50万,公司必须还要有20个人以上的社保证明。同时还要提供企业半年的银行资金流水。如果小型公司基本是不用考虑的…

pcb实验六-元件设计

目录 一,绘制28管脚PLCC封装ATF750C-10JC元件 二,绘制变压器原理图符号,并生成各种库文件输出报表 1,绘制变压器原理图 2,添加封装 3,输出报表文件 三,绘制音乐集成芯片及LCD元件 1&…

隐马尔可夫模型

目录 1. 通信系统 2. 各种“马尔可夫”们 2.1 马尔可夫假设 2.2 马尔可夫链 2.3 隐马尔可夫模型 2.3.1 将隐马尔可夫模型应用于解码问题 2.3.2 如何训练隐马尔可夫模型 2.3.2.1 有监督的训练 2.3.2.2 无监督的训练 1. 通信系统 通信的本质就是一个【编码传输解码】的…

【C++】STL:栈和队列模拟实现

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

【设计模式深度剖析】【2】【行为型】【命令模式】| 以打开文件按钮、宏命令、图形移动与撤销为例加深理解

👈️上一篇:模板方法模式 | 下一篇:职责链模式👉️ 设计模式-专栏👈️ 文章目录 命令模式定义英文原话直译如何理解呢? 四个角色1. Command(命令接口)2. ConcreteCommand(具体命令类&…

linux进程间通讯指南-打通IPC大门,高效沟通无阻

在现代操作系统中,进程就像独立的个体,有时需要相互合作、数据共享,这就要求进程间能够高效通信。本文将为你揭开Linux进程间通信(IPC)的神秘面纱,探讨各种IPC工具的运作原理,同步机制的重要性,以及如何规避…

Ubuntu安装cuda

文章目录 前言一、安装NVIDIA驱动1.1 过程中的问题1.2 解决方法1.3 重启后出现 perform MOK management 二、安装Cuda2.1 检查是否安装显卡驱动2.2 安装Cuda2.3 验证CUDA是否安装成功 三、配置环境变量---未完2.4 图片居中加调整大学 总结 #pic_center 前言 只是为方便学习&…

淘宝扭蛋机源码解析:功能实现与技术细节

随着在线购物和娱乐的融合,淘宝扭蛋机作为一种创新的购物娱乐方式,受到了广大用户的喜爱。本文将深入解析淘宝扭蛋机的源码,探讨其功能实现与技术细节,以期为开发者们提供一些有价值的参考。 一、功能实现 1.用户登录与注册 淘宝…

win11通过网线分享网络到Ubuntu工控机

1.条件:一个能无线联网的win11,一根网线,一台Ubuntu工控机,并且使用网线连接两者 2.在win11电脑上 2.1 打开控制面板的网络和Internet 2.2 进入网络和共享中心,在左侧进入 更改适配器设置 2.3 在WLAN上右键&#xff0…

R语言数据探索和分析21-中国GDP及其影响因素多元线性回归分析

一、研究背景和意义 GDP 是宏观经济中最受关注的经济统计数字,目前我国国内生产总值年均增长率均明显高于同期美、日等发达经济体和巴 西、俄罗斯、南非、印度等其他金砖国家,成为世界经济增长的主力军,GDP 的增长对一个国家有着十分重要的意…