热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonORM链接数据库sqlalchemy库的使用(一)

最近上线的任务有点多,一直想写的东西也没啥时间,赶上周六在公司附近体检顺道就来公司写的东西。今天就简单写一个python连接数据库的第三方库sqlalc

最近上线的任务有点多,一直想写的东西也没啥时间,赶上周六在公司附近体检顺道就来公司写的东西。今天就简单写一个python连接数据库的第三方库sqlalchemy一点点自己的使用心得。

1.说说接口测试为什么要连接数据库,大体上分为两部分,第一部分就是request和response,请求发送给服务端,服务端收到请求后给我们对应的response(数据类型是字典格式),其中请求中的一些参数当然可以写死在代码里请求,但是这种有很强的局限性并且有些一些业务逻辑是测试不到,最好的的肯定是动态的去数据库中获取对应参数的值。第二部分就是response['code']=0(当然这是开发之间约定的,我们公司定的code=0代表返回正常),我们不能认为服务端返回code=0就是正确,比如post这种提交表单的接口,服务端要向数据中插入数据,我们肯定要校验是否真的插入成功产生了一条新的数据,至少验证主键ID是否递增了吧,那么还是要用到数据库,重要性和基础性就不言而喻了。

2.选择sqlalchemy,我去年刚开始写接口测试,是用的别的业务线接口测试框架,使用的是MYSQLdb的库,就是sql语句通过string类型的形式传进去,虽然上手很快但是维护起来就是噩梦一样,如果sql语句太长了除了自己I写的可以自己维护,其他人看完了完全不懂啥意思。而sqlalchemy则是实例化调取方法的形式,整体的格式很清晰,用起来也很方便。

3.关于如何安装sqlalchenmy,这个自行百度吧,我个人很不喜欢写安装的东西,就是感觉有点啰嗦。

4.sqlalchenmy配置链接数据库,首先我们实例化基类用于作为类和数据库的一个桥梁

#创建对象的基类,这个基类base是维系类和数据库使用

Base = declarative_base()

其次就是把数据中一个表数据的字段定义到一个类里面去,比如下面:

class ORM_jz_user(Base):

    #表的名字

    __tablename__='jz_user'

    #表结构

    id=Column(Integer,primary_key=True)

    user_name=Column(String)

    mobile=Column(Integer)

    password=Column(String)

    third_party_type=Column(Integer)

    third_party_uid=Column(String)

这里面我们ORM_jz_user类来和数据中jz_user表建立映射关系,其中__tablename__要和数据中的表名称要一致,要不然就找不到了。

id表示jz_user的主键ID,其他定义了字段的类型也是要数据中保持一致。

再就是链接数据中的配置

engine_real=create_engine(数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名)

比如说:engine_real=create_engine("mysql+mysqldb://username:*****:888/sqlName")这种格式,因为涉及公司隐私就是简单举个例子。

链接成功后就是进行查询的操作了,比如说:

DBSession=sessionmaker(bind=engine_real)

session=DBSession()

result_userid=session.query(ORM_jz_user).filter(ORM_jz_user.mobile=='17777777777').one()

通过sessionmaker()这个类通过bind参数来链接数据中并建立session

query()里面是我们刚刚建立的表的类名,类似于select * from jz_user中的jz_user 从哪个表里面查询。

filter()是查询条件和sql语句红where作用是一样的,当然也可以存在多个条件例如:

result_userid=session.query(ORM_jz_user).filter(ORM_jz_user.mobile=='17777777777').filter(ORM_jz_user.sex=1)

当然了一般mobile是唯一的存在不用后面的条件这里就是举个例子。

one()表示返回一个对象,这里面还有对应all()表示查询有多个返回结果就都取出来返回给我

这面强调一下无论通过.one()还是.all()返回都是查询对象,你要通过刚刚做的映射类的属性来获取对应value,比如说:

print "userid:",result_userid.id

通过调用id属性才能获取到查询id的值是多少。

因为all()返回时所有查询结果那么就有一个排序的问题,就用用到order_by(),比如说:

result_recId=self.session.query(ORM_jz_biz_wallet_record).filter(ORM_jz_biz_wallet_record.user_id==sql_userid)\

.filter(ORM_jz_biz_wallet_record.record_type=='16').order_by(desc(ORM_jz_biz_wallet_record.id)).all()

这里面就用到order_by()和all(),order_by()表示按照那个字段排序,desc()倒叙的意思。

当然这里面也可以用查询列表的方式把all()替换掉,因为当有多个结果是返回列表类型的数据格式。例如:

result_recId=self.session.query(ORM_jz_biz_wallet_record).filter(ORM_jz_biz_wallet_record.user_id==sql_userid)\

.filter(ORM_jz_biz_wallet_record.record_type=='16').order_by(desc(ORM_jz_biz_wallet_record.id))[0:3]

这里面截取的是4条数据。

这大概就是我目前用到基本用法,我同事跟我说她的业务线有跨库的时候回遇到坑,目前我这边还有垮库的需求,所以没有关注,这个库功能还是很牛逼的,我回头也吧官方sqlalchemy官方没事翻译的玩玩,之前requests官方文档后面的高级用法,我看了一些有一些实在看不懂,还是对网络协议理解的太肤浅了,理解了一些在慢慢更新的吧。

这里面我还想说一些个人看法,很多QA还是有想绕开代码去做测试的想法,当然也有一些很优秀的功能测试,但是毕竟有很多局限性,很多时候就是要自己去写你才能发现很多rd写的一些思路也才能更好的发现一些隐藏的问题,写一些脚本也可以方便测试提升效率,都是一些自己看法吧,测试这条路你想走多远能支撑你的还是你的代码能力吧
























推荐阅读
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 深入解析 SQL 数据库查询技术
    本文深入探讨了SQL数据库查询技术,重点讲解了单表查询的各种方法。首先,介绍了如何从表中选择特定的列,包括查询指定列、查询所有列以及计算值的查询。此外,还详细解释了如何使用列别名来修改查询结果的列标题,并介绍了更名运算的应用场景和实现方式。通过这些内容,读者可以更好地理解和掌握SQL查询的基本技巧和高级用法。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 在关系型数据库中,数据约束是指在向数据表中插入数据时必须遵循的限制条件。在MySQL和MariaDB中,常见的数据约束包括主键约束、唯一键约束、外键约束以及非空约束等。这些约束确保了数据的完整性和一致性,是数据库管理中的重要组成部分。通过合理设置和使用这些约束,可以有效防止数据冗余和错误,提升数据库的可靠性和性能。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
author-avatar
那是黑夜过后的黎明_182
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有