大家好~我是
米洛
!
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程
,希望大家多多支持。
欢迎关注我的公众号米洛的测开日记
,一起交流学习!
# 回顾
上一节我们给自己代码做了一次review,在review的过程中我注意到我们的数据库
还没有完全支持postgresql,所以今天我们就来试试看,切换底层数据库
,pity能不能顶得住。
# 定义枚举
如我所说,对于具体的sql_type,我们应该用枚举类给定义起来,所以我们来定义一下枚举:
接着我们去替换对应的地方,也就是上一节所说的magic number:
这里如果不满足我们的条件,则直接抛异常
,提示用户没有这个数据库类型。
# 安装pg
进入下载页,下载对应操作系统的pg即可。傻瓜式安装后,如果没有启动,则需要在安装目录进行如下操作:
// 在bin目录
// 数据路径是pg在磁盘的存储数据路径
pg_ctl -D 数据存储路径 start
2
3
4
启动之后我们可以用DataGrip连接数据库,然后创建pity
数据库。这一步类似于mysql的
create database pity;
一切都是傻瓜式的,嘿嘿。
# 下载异步pg引擎
经过sqlalchemy官网的指示,我们下载asyncpg引擎:
pip install asyncpg
# 修改jdbc
因为我们是临时配置测试一下,所以直接写死了,这些都是我本地的数据库账号密码和端口等数据。
本次测试并不是要切换到pg,而是给只能选择pg(比如我上家公司就没有mysql)的人一个选择,顺便也看看pity能不能无缝切换到pg。
# 重新建表
创建好数据库以后,我们第一步就是要测试数据表是否能够建立。我们启动一下pity试试。
一上来就给咱一个猛的报错,可以看到,我们的ddl里面包含的是datetime,但pg里面并没有datetime
,确实,我之前使用的时候也都用的timestamp
。
所以这意味着,如果我们要兼容pg,则需要把datetime类型全部换成TIMESTAMP,换是可以换,但我就怕我们现在的代码会受影响。
这里我已经批量替换过了,发现sql里面反射出来的依旧是datetime类型(Python的datetime),那就说明代码没啥问题。
pg也没有tinytext和longtext,所以我们需要统一改成text兼容pg。
# 总体来说改动并不大,这就是我们用sqlalchemy(orm)的好处。
来看看改造后,是否好用:
可以看到,数据表基本都建好了,但是少了一只:apscheduler
。忘了这个硬茬了!!!
# 适配apscheduler
总体来说,由于apscheduler的存在,我们还是得弄一套同步session
,至于pg的同步session,我们需要安装psycopg2:
pip install psycopg2
再次启动服务,发现表格建好了!
# 试试pity吧
# 问题一: deleted_at
出师不太利,一上来就报了个deleted_at的错,原来我有的deleted_at的字段定义的是timestamp,但实际上我查询的时候用的是否等于0。
所以我统一把deleted_at改成bigint了。
# 问题二: date_format
接着又遇到了一个date_format的错,我们试着解决下吧:
对于mysql这句话是没毛病的,格式化日期,但是pg不太支持呀,所以我们得换通用点的方式。
这里我们就不采用sql的func了,直接用Python的方法,这样都兼容,按照图里这么改。改好了之后mysql继续测试一下,发现没毛病。
# 问题三: timestamp不支持直接比较字符串
我们之前比较日期,用between或者大于小于的时候,传入字符串的时间格式都莫得问题,但是换pg之后她就傲娇
了。原因是,它不能把text直接转成timestamp,所以我们得手动转一下,MySQL倒是2种都支持。
# 问题四: pg的数据传入id字段,哪怕为None insert的时候会把id置为0
为了解决这个问题,我们就不赋予id属性了:
# 也许跟用的异步pg引擎有关,我试了下这个也不影响MySQL,所以就迁就下吧。
以上就是我总结的,数据库切换引发的一系列的问题,希望对大家有所帮助
。
我是米洛,一直陪伴各位学习!免费的
小黄心
,帮我点一个吧!