如何使用ORM中的网红“sqlalchemy”,连接python数据库

sqlalchemy是python当中比较出名的orm(object relational mapping)程序, 即对象映射关系程序。

之所以选择sqlalchemy,是因为相较于其他python库,如storm、sqlobject等,其提供了企业级API,使得代码有健壮性和适应性,其设计灵活,使得能轻松写复杂查询,同时提供了兼容众多数据库(如 SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird)的持久性模型。

首先,介绍一下sqlalchemy 的架构和工作原理:

如图所示,sqlalchemy主要分为三个模块:

ORM:实现一个Mapper对象,将Python中定义的类与数据库中的表建立关联,以及类的实例(instance)和表的行(row)建立关联;

Core:Core部分与ORM解耦和,如果想通过session管理、连接池管理、数据库语句执行sql语句,就可使用core。Core中包含的部件可以直接支持使用SQL Expression和RAW SQL。使用SQL Expression阅读性和可维护程度高,而RAW SQL更灵活,支持复杂的SQL语句;

DBAPI:sqlalchemy 没有提供直接连接数据库的功能,因此第三方库提供来实现数据库的连接。

通过对图的分析,我们可以清晰得出:使用sqlalchemy可以分为三种方式:

使用sql expression,通过 SQLAlchemy 的方法写sql表达式,简介的写sql;

使用raw sql,直接书写 sql;

使用ORM避开直接书写 sql;

简单了解sqlalchemy后,接下来介绍的主要是我们自动化框架中如何运用sqlalchemy的ORM方式操作数据库,提供统一的数据库验证方法协助完成自动化单元测试中的验证工作。

首先来一张自动化框架数据库连接的整体思维图:

框架中对数据库的操作大致分为五个部分:

database_factory模块:定义engine和操作数据库的一些公共方法;

connect_to_database装饰器:通过对database_operator模块中方法装饰(主要获取数据库表的映射类),完成数据库engine和session的创建,支持多个数据库session的建立,同时支持使用sqlalchemy的三种方式;

database_operator模块:通过调用database_factory模块公共方法来定义一些具体的操作表的语句;

database_object模块:自定义类;

database_assertion模块:对外提供公共的查询数据库方法,校验数据库值方法等。

思维图中简要展示了各个模块之间的联系,接下来详细介绍各个模块之间如何协同工作,完成对数据库的操作。

database_factory模块

build_engine方法定义,供connect_to_database装饰器调用;

查询数据库方法get_record_from_table等(其他方法此处忽略,重点讲解查询方法,单元测试中数据库校验只用到查询方法),供database_operator模块调用;

示例代码如下:

connect_to_database装饰器

支持ORM模式和RAW SQL模式;

支持同时连接多个数据库session;

数据库连接sql操作完成关闭所有的session;

示例代码如下:

database_operator模块

定义了具体的操作表的方法,被connect_to_database装饰,调用database_factory中公共方法;

示例代码如下:

database_object模块

定义所有的数据库表映射类,供database_operator模块连接数据库表使用;

python库sqlacodegen可以自动生成models文件,我们的自动化框架中支持oracle和mysql数据库,使用sqlacodegen产生这两种数据库映射类的语法如下:

1. oracle:

2. mysql:

生成的映射类示例代码如下:

所有的映射类都是继承自基类Base,declarative_base() 创建了一个BaseModel 类,这个类的子类可以自动与一个表关联。此处以 WfRoleResPerm 类为例,它的 __tablename__ 属性就是数据库中该表的名称,它有 role_id 和 perm_id 这两个字段,分别为Numeric和 38 个定长字符。

database_assertion模块

get_column_value_from_table方法底层调用database_operator模块中的具体连接数据库方法;

提供公共的校验数据模块,校验数据是否正确或者是否为空,主要方便单元测试中对数据update的校验;

示例代码如下:

编写公共的数据库校验方法,首先用户不需要知道底层数据库连接、查询等是如何实现的,同时对外(即单元测试)提供了统一查询数据库方法,不至于每个单元测试中调用方法各异,最后其支持轮询查询数据库表,使得没必要每次都分开去查询不同的数据库表。

了解了这几部分模块工作原理后,我们来看看单元测试用例中是如何运用的。

可以看到,只需要定义查询的json数据,调用公共的查询方法就ok啦。

本文作者:黄媛(点融黑帮),目前就职于点融网Techops QA团队,测试开发工程师,专注于自动化测试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容