SQLAlchemy-Python下的ORM工具使用

一、 摘要
经验案例描述的是SQLAlchemy的使用案例。全文从背景描述、SQLAlchemy-概述、SQLAlchemy-session详解、SQLAlchemy-项目应用介绍、总结等方面对本案例进行说明。
案例中重点描述SQLAlchemy-session详解、SQLAlchemy-项目应用介绍两个方面的内容。前者对于SQLAlchemy的原理进行较为深度的解析,后者为在项目实际应用过程中的案例分析。读者可以参考本文对python下的ORM框架有一个简要了解,如有很强烈的兴趣可以参考文末的资料对SQLAlchemy进行学习、应用。
二、 背景描述
组内需要承接一些平台开发工作,开发涉及到web框架应用、数据库构建、主流程业务代码编写等内容。个人工作在项目中承接有数据库构建的工作内容。较早版本时,使用SQL语句直接在python语言下进行操作,但是此种处理过程中遇到过如下问题:1)SQL的语法与python的语法编写存在区别,导致两者编写不流畅;2)SQL代码在python中编写存在需要更换较多的可变参数信息,在实际操作过程中会存在遗漏等问题;3)SQL原生语句对于过滤等操作存在使用不方便的情况。基于以上原因,在项目中选择了一款基于python的ORM框架—SQLAlchemy,便于在python语言编码情况使用面向对象的方式进行数据库操作。
三、 SQLAlchemy-概述
SQLAlchemy SQL工具包和对象关系映射器是一套用于处理数据库和Python的综合工具。它有几个不同的功能领域,可以单独使用或组合在一起。其主要组件如下所示,组件依赖关系组织成层:
在这里插入图片描述

以上,SQLAlchemy的两个最重要的前向部分是 对象关系映射器 以及 SQL表达式语言。SQL表达式可以独立于ORM使用。使用ORM时,SQL表达式语言仍然是面向公共的API的一部分,因为它在对象关系配置和查询中使用。如果对于SQLAlchemy有更加全面的了解,建议查看附录文档。
四、 SQLAlchemy–session详解
SQLAlchemy操作中最基础及最重要的工作是创建一个session.本案例将对其概念及原理进行详细说明,便于理解SQLAlchemy这个ORM框架与SQL数据库的交互过程。如果对于SQLAlchemy的底层代码非常感兴趣,可以访问附录SQLAlchemy github源码路径进行源码学习。
概念
session用于创建程序和数据库之间的会话,所有对象的载入和保存都需通过session对象 。通过sessionmaker调 用创建一个工厂,并关联Engine以确保每个session都可以使用该Engine连接资源:
在这里插入图片描述

操作
session的常见操作方法包括:1)flush:预提交,提交到数据库文件,还未写入数据库文件中;2)commit:提交了一个事务,把内存的数据直接写入数据库;3)rollback:回滚;4)close:关闭。
内部原理
session对象包含了三个重要的部分:1)标识映射(Identity Map);2)对象的状态 / 状态跟踪;3)事务。
标识映射
标识映射是与ORM关联的集合,通过标识映射保证了数据库操作的准确性。具体的实现原理是:维护一个Python字典(IdentityMap),关联这个Session对象到数据库ID的映射,当应用程序想要获取一个session对象时,若该对象不存在,标识映射会加载该对象并缓存,若该对象已存在,则直接获取。
状态跟踪
一个Session对象从创建到销毁,依次经历四种状态,分别是:1)Transient:刚new出来的对象,还不在会话中,也没有保存到数据库。2)Pending:transient的对象调用add后,就会变成pending状态,这时会加入sqlalchemy的监管范围,数据并未更新到数据库。3)Persistent:该状态表明数据库里已经记录了该对象,在两种情况下对象处于该状态:一是通过flush()方法刷新pending对象,二是从数据库query()得到对象。4)Detached:在会话中的事务提交之后,所有的对象都将是Detached状态。
所谓的状态跟踪,就是跟踪以上四个状态,保证数据的准确性并在合理的时机丢弃对象以保证合理开销,那么具体是怎么实现的呢?
我们可以看到,只有在pending状态时,对象的内存数据和数据库中的数据不一致,在Persistent状态时,内存数据和数据库数据已经一致,那么此后任意时刻丢弃该对象数据都是可以的,这时就需要找个合适的时机丢弃对象,过早或过晚都有其缺陷。于是,就让垃圾回收器来做决定,在内存不够的时候释放对象,回收内存。
Session对象采用了弱引用机制,所谓弱引用,就是说,在保存了对象的引用的情况下,对象仍然可能被垃圾回收器回收。在某一时刻通过引用访问对象时,对象可能存在也可能不存在,如果对象不存在,就重新从数据库中加载对象。而如果不希望对象被回收,只需要另外保存一个对象的强引用即可 。
session对象包括三个属性:1)new:刚加入会话的对象;2)dirty:刚被修改的对象;3)deleted:在会话中被删除的对象。三个属性共同的特点就是内存的数据和数据库数据不一致,也就是对象处于pending状态,这也就表明了session保存了所有对象处于pending状态的强引用。
五、 SQLAlchemy-项目应用介绍
项目需求
数据库结构
SQLAlchemy使用
1)定义建立设备异常信息记录表函数。具体操作过程参考附录SQLAlchemy教程,代码如下所示:
在这里插入图片描述
2)定义删除数据表的函数。具体操作过程参考附录SQLAlchemy教程,代码如下所示:
在这里插入图片描述

3)定义数据插入到数据表函数。函数首先对获取到的字典型数据进行解析,而后根据获取到的字典型数据构造设备异常对象数据,通过SQLAlchemy的query方法对数据进行查询,查询结果依据重要类型数据进行结果过滤,获取到数据表中是否存在雷同数据,存在雷同数据则不进行雷同数据插入数据操作,不存在雷同数据,将数据插入到设备异常数据表中。

具体操作过程参考附录SQLAlchemy教程,具体代码如下所示:
在这里插入图片描述
4)定义查询数据表函数。与插入函数类似,均有数据解析过程。下面重点讲述查询过程,通过SQLAlchemy的query方法获取获取到与过滤其匹配的内容,并通过字典型列表的方式返回。此处有一个需求是对于时间段内的查询结果获取,但是SQLAlchemy的过滤其内无此缺省方法,通过构造一定的逻辑将时间段内的目标内容输出,具体一下源码。其他具体操作过程见参考附录SQLAlchemy教程。
在这里插入图片描述
在这里插入图片描述

5)其他方法。SQLAlchemy ORM工具库除了可以处理以上的一些操作。还可以对数据库进行各式的操作。具体操作过程见参考附录SQLAlchemy教程。
六、 总结
全文从背景描述、SQLAlchemy-概述、SQLAlchemy–session详解、SQLAlchemy—项目应用介绍、总结等方面对本案例进行说明。
案例中重点描述SQLAlchemy–session详解、SQLAlchemy—项目应用介绍两个方面的内容。前者对于SQLAlchemy的原理进行较为深度的解析,后者为在项目实际应用过程中的案例分析。
后续笔者将使用SQLAlchemy对数据库操作进行积累优化,增加对于ORM的熟悉程度,并且减少代码的冗余量,更高效地完成承接工作内容。
七、 参考资料

  1. SQLAlchemy官网:http://www.sqlalchemy.org/docs/orm/query.html
  2. SQLAlchemy中文教程:https://www.osgeo.cn/sqlalchemy/orm/examples.html
  3. SQLAlchemy seesion详解:https://www.cnblogs.com/ybjourney/p/11876595.html
  4. 《SQLAlchemy python数据库实战》 [美]贾森·迈尔斯(Jason Myers)、里克·科普兰(Rick Copeland)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值