mysql之造数

背景

在进行编码自测的时候经常会涉及到数据库造数。当表字段很多时候,手工造数就比较麻烦,可以考虑使用工具进行造数。

造数工具还是比较多的,目前试用了下,使用基于python开源的datafaker还是比较方便的。

使用说明

以mysql为例

  • 安装datafaker

    1
    pip install datafaker
  • 安装mysql包

    1
    pip install mysqlclient
  • 使用mysql命令获取表结构参数

    1
    show full columns from tablename

    将结果中的Field、Type、Comment列获取放在excel里

  • 构造meta.txt文件

    datafaker造数主要通过meta文件进行规则配置,官方的例子如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    id||int||自增id[:inc(id,1)]
    name||varchar(20)||学生名字
    school||varchar(20)||学校名字[:enum(file://names.txt)]
    nickname||varchar(20)||学生小名[:enum(鬼泣, 高小王子, 歌神, 逗比)]
    age||int||学生年龄[:age]
    class_num||int||班级人数[:int(10, 100)]
    score||decimal(4,2)||成绩[:decimal(4,2,1)]
    phone||bigint||电话号码[:phone_number]
    email||varchar(64)||家庭网络邮箱[:email]
    ip||varchar(32)||IP地址[:ipv4]
    address||text||家庭地址[:address]

    即前面获取的三列信息,通过||分割,如果有特殊规则,则在Comment后增加规则,详细规则可参考:

    https://github.com/gangly/datafaker/blob/master/doc/数据构造规则.md

  • 屏幕打印造数命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ datafaker rdb mysql+mysqldb://root:root@localhost:3600/test?charset=utf8 stu 10 --outprint --meta meta.txt --outspliter ',,'

    1,,鲍红,,人和中心,,高小王子,,3,,81,,55.6,,13197453222,,mwei@gmail.com,,192.100.224.255,,江苏省西宁市梁平朱路I座 944204
    2,,刘东,,清华中学,,高小王子,,3,,31,,52.4,,15206198472,,lili@kong.cn,,203.0.190.6,,内蒙古自治区嘉禾市兴山呼和浩特街E座 706421
    3,,匡静,,人和中心,,歌神,,9,,84,,72.51,,18944398099,,zouchao@gmail.com,,203.1.53.166,,安徽省永安市沈河惠州街x座 345415
    4,,王宇,,猪场,,逗比,,6,,89,,19.3,,18628114285,,na58@cai.net,,169.4.126.215,,山西省梧州县朝阳何路y座 846430
    5,,陆桂芝,,猪场,,逗比,,8,,99,,92.22,,13304570255,,na55@ti.cn,,168.136.127.200,,江苏省英县徐汇尹街C座 908240
    6,,顾阳,,猪场,,歌神,,9,,32,,43.14,,18025578420,,linping@pr.net,,174.50.222.39,,黑龍江省惠州县梁平大冶街Z座 611736
    7,,杨洁,,人和中心,,鬼泣,,6,,35,,81.25,,13654306263,,minzhong@xiaxia.cn,,100.57.79.2,,湖北省琳市沙湾汪街V座 544660
    8,,申璐,,人和中心,,鬼泣,,6,,14,,73.61,,13866020503,,changxiulan@chaoxia.cn,,198.248.254.56,,陕西省合山县东丽宁德街Q座 810017
    9,,申强,,广东中学,,逗比,,7,,48,,90.65,,13915915013,,ysun@chao.cn,,169.210.122.39,,甘肃省冬梅县城北六安街Z座 619755
    10,,李丹丹,,旧大院,,鬼泣,,3,,67,,87.63,,18899812516,,xiulanmo@qin.cn,,192.52.218.133,,湖南省宜都县萧山澳门街E座 791911
    generated records : 10
    printed records : 10
    time used: 0.458 s
  • 写入mysql造数命令

    1
    datafaker rdb mysql+mysqldb://root:root@localhost:3600/test?charset=utf8 stu 10  --meta meta.txt

注意

  • 当类型是int(11)这种情况时,目前版本是会报错的:

    1
    ValueError: empty range for randrange() (11,1, -10)

    目前是可通过在meta.txt对应的行中,在comment中注明规则,如:

    1
    class_num||int||班级人数[:int(10, 100)]

    目前也提交对issue待解决。

  • 当使用date_between造数时,当时间范围超过当前日期时会报错。

  • 更多可参考官方github:https://github.com/gangly/datafaker