python+pymysql调用数据库准备数据

测试人员是不是经常因为一些测试需要的数据进行烦恼。
例如:开发人员需要每个状态的用户,而你需要不厌其烦的每个账号去申请,创造每个状态的用户。

其实像这种重复劳动损伤脑细胞的活为何不交给机器去完成呢。

我们进入正题
1. 研读pymysql的API文档(二次封装)
  • 连接数据库(创建游标)
  • 准备sql(需要变量的参数化)
  • 执行sql语句的方法
  • 获取自增ID的方法
  • 查询语句方法
2.业务代码(各个状态的账号)
3.框架实现
  • 调用二次封装的框架
  • common文件对应的sql语句
  • 调用业务代码生成账号

一、写一个封装的调用mysql的模块

代码实现如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 数据准备调用mysql

import pymysql.cursors
import logging
import uuid
import time
import common as c

DB = None

def connect(host, user, password, db, port,charset='utf8'):
    """连接MySql"""
    global DB
    if DB == None:
         DB = pymysql.connect(host=host,
                         user=user,
                         password=password,
                         db=db,
                         port=port,
                         charset=charset,
                         cursorclass=pymysql.cursors.DictCursor)
    return DB


def execute(sql):
    # type: (object) -> object
    """执行sql
    :return row number affected
    :except sql error
    """
    global DB
    try:
        with DB.cursor() as cursor:
            res = cursor.execute(sql)
            DB.commit()  # 链接不会默认提交需要您手动提交
        return res
    except Exception, e:
        DB.rollback()  # 若错误则回滚
        logging.info("sql is empty or error %s", e)


def getNewId(sql):
    """执行sql获取自增ID"""
    global DB
    try:
        with DB.cursor() as cursor:
            cursor.execute(sql)
         DB.commit()
        res = cursor.lastrowid
        # 获取最新的语句的自增ID
        return res
    except Exception, e:
        DB.rollback()  # 若错误则回滚
        logging.info("sql is empty or error %s", e)


def select(sql):
    """查询语句获取查询结果"""
    global DB
    try:
        with DB.cursor() as cursor:
            cursor.execute(sql)
            result = cursor.fetchone()
            print result
    except Exception, e:
        logging.info("sql is empty or error %s", e)


def setUid():
    """生成一个唯一的UID"""
    uid = str(uuid.uuid1())
    id = ''.join(uid.split('-'))
    return id


def setPhone():
    """生成一个唯一手机号码"""
    number = time.time()
    phone = int(number * 10)
    return phone


def setEmail():
    """生成一个唯一的邮箱号码"""
    number = str(int(time.time()))
    email = number[-5:] + c.EMAIL
    return email


def close():
    """关闭MySQL连接"""
    global DB
    DB.close()

上面用到了一些python内置库生成手机号和邮箱,还有用户所需的uid。

二、引用log模块获取日志

准备工作:
需要一个日志的捕获,包括框架和源码抛出的expection。

代码如下

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 基础包:日志服务
import logging
import time

def getLogger():
global tezLogPath
try:
    tezLogPath
except NameError:
    tezLogPath = "/data/log/apiTest/"

FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
# file = tezLogPath + time.strftime("%Y-%m-%d", time.localtime()) + ".log"
# logging.basicConfig(filename=file, level=logging.INFO, format=FORMAT)
# 开发阶段为了方便调试,可不输出到文件
logging.basicConfig(level=logging.INFO, format=FORMAT)
return logging

三、构建业务逻辑代码

准备工作:
业务逻辑相关生成各种状态的代码

代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 数据准备所需代码


import dataPreparationSql as sql
import common as c
import log
logging = log.getLogger()

host     =    c.HOST
user     =    c.USER
password =    c.PASSWORD
db       =    c.DB
port     =    c.PORT

email = sql.setEmail()
phone = sql.setPhone()
uid   = sql.setUid()


connect = sql.connect(host=host, user=user, password=password, db=db, port=port)


def addProUser(proName, userEmail, nickName, companyId=None):
    """
    新增企业用户
    :Args:
        proName   - 企业名称
        userEmail - 企业邮箱
        nickName  - 用户昵称
        companyID - 默认为空重新生成,需要添加指定企业ID需手动填写参数
    """
    global connect
    try:
        if companyId == None:
            company = sql.getNewId(c.SQL_COMPANY % proName)  # 执行sql新增一个企业 tbl_pro_company
            sql.execute(c.SQL_USER % (userEmail, phone, uid))  # 执行sql增加一个用户 tbl_user
            res = sql.execute(c.SQL_PROUSER % (uid, company, nickName, userEmail, phone))  # 执行sql添加一个企业用户 tbl_pro_user
            # select = sql.select((c.SQL_SELECT) % companyId)
            logging.info("effect row %s", res)
            # logging.info("results %s", select)
        else:
            sql.execute(c.SQL_USER % (userEmail, phone, uid))
            res = sql.execute(c.SQL_PROUSER % (uid, companyId, nickName, userEmail, phone))
            logging.info("effect row %s", res)
    except Exception, e:
        logging.info("add Pro User error %s", e)


def addCommonUser(userEmail, nickName):
    """
    新增普通客户
    :Args:
        userEmail - 用户邮箱
        nickName  - 用户昵称
    """
    global connect
    try:
        accountId = sql.getNewId(c.SQL_ACCOUNTID % uid)  # 添加一个账户ID tbl_account
        sql.execute(c.SQL_COMMON_USER % (userEmail, phone, uid, accountId))  # 添加一个用户到tbl_user
        sql.execute(c.SQL_CUSTOMER % (uid, nickName, userEmail, phone))  # 添加一个用户到tbl_customer
        res = sql.execute(c.SQL_WALLET % (uid, accountId))  # 添加一个钱包表
        logging.info("effect row : %s", res)
    except Exception, e:
        logging.info("add Common User error: %s", e)


def addDesigner(userEmail, nickName):
    """
    新增普通设计师
    :Args:
        userEmail - 用户邮箱
        nickName  - 用户昵称
    """
    global connect
    try:
        accountId = sql.getNewId(c.SQL_ACCOUNTID % uid)  # 添加一个账户ID tbl_account
        sql.execute(c.SQL_DESIGNER_USER % (userEmail, phone, uid, accountId))  # 添加一个用户到tbl_user
        sql.execute(c.SQL_DESIGNER % (uid, nickName, userEmail, phone))  # 添加一个用户到tbl_designer
        sql.execute(c.SQL_WALLET % (uid, accountId))  # 添加一个钱包表
        remarkId = sql.getNewId(c.SQL_REMARK % uid)  # 添加一个评价ID 不然会影响推送
        res = sql.execute(c.SQL_ABILITY % (remarkId, uid))  # 添加一个设计师能力评分 不然影响推送
        logging.info("effect row : %s", res)
    except Exception, e:
        logging.info("add designer error: %s", e)

四、关于common模块

准备工作:
所有的参数和常量我们会整理到这个文件中,因为设计业务和服务密码、数据库密码这里展示一部分。
代码如下:

 #!/usr/bin/python
# -*- coding: UTF-8 -*-
# sql常量

#测试环境数据库配置
HOST = '127.0.0.1'
USER = 'root'
PASSWORD = '123456'
PORT = 3306
DB = 'MYSQL_DB'


EMAIL = '@sina.com'

sql = 'SELECT * FROM tbl_user'

SQL_COMPANY = """
                 INSERT INTO tbl_pro_company (key) VALUE (values)
              """

SQL_USER = """
             INSERT INTO tbl_user (key) VALUE (values)
           """

SQL_PROUSER = """
              INSERT INTO tbl_pro_user (key) VALUE (values)
              """

五、写一个run文件安全性剥离

需要注意为什么会用time.sleep(),因为我们用了python内置库生成uid根据时间戳生成md5格式的。如果直接运行这3个账号的uid就一样了,违背了uid唯一性了。

代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 执行脚本生成数据

import tezPreData as Data
import time

Data.addDesigner('账号','名称')             # 添加一个设计师
time.sleep(2)
Data.addProuser('企业名称','账号','名称')    # 添加一个企业用户
time.sleep(2)
Data.addCommonUser('账号','名称')           # 添加一个普通用户
time.sleep(2)

Data.sql.close()

那么一个简易的数据准备脚本完成,可以按照自己业务所需的情况,调用函数。请告别手工,解放双手才是一个IT工程师最应该去关注的。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,394评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • CloudJavaBackendSummaries1、开发环境eclipse工程,引入jw仓库的jw-base,3...
    燕京博士阅读 998评论 0 0
  • 应该就是深夜11点多点,终于点击下载了简叔,翻了翻友友们对简叔的评价,都说简叔这里,是远离了商业气息,多了许多清净...
    灵山七宝剑阅读 268评论 1 0
  • 1504年,米开朗基罗完成了他雕塑生涯中最具有代表性的杰作“大卫”,这个传说中的英雄,从表情到姿态,都精妙的体现出...
    狼烟牧笛阅读 355评论 0 2