python ORM链接数据库-sqlalchemy库的使用(一)

最近上线的任务有点多,一直想写的东西也没啥时间,赶上周六在公司附近体检顺道就来公司写的东西。今天就简单写一个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写的一些思路也才能更好的发现一些隐藏的问题,写一些脚本也可以方便测试提升效率,都是一些自己看法吧,测试这条路你想走多远能支撑你的还是你的代码能力吧























猜你喜欢

转载自blog.csdn.net/gogoboi_jin/article/details/76714154