一、Datafaker 简介

DataFaker是一个大批量测试数据和流测试数据生成工具,兼容python2.7和python3.4+,本教程基于官方文档修改,目的在与方便快速上手,如有错误请参考DataFaker 官方文档

二、下载安装

DataFaker 安装

  • PyPi查看Datafaker https://pypi.org/search/?q=datafaker
  • 安装DataFaker pip install -i https://pypi.tuna.tsinghua.edu.cn/simple datafaker
  • 卸载DataFaker pip uninstall datafaker ```bash $datafaker —version

    0.7.4

$datafaker -h

usage: datafaker.cmd [-h] [—auth [AUTH]] [—meta [META]] [—metaj [METAJ]] [—interval INTERVAL] [—batch BATCH] [—workers WORKERS] [—version] [—outprint] [—outspliter OUTSPLITER] [—locale LOCALE] [—format FORMAT] [—withheader] [dbtype] [connect] table [num]

datafaker, a tool to make generate data easy.

positional arguments: dbtype data source type connect connect info to the database table table to process num number of records to generate

optional arguments: -h, —help show this help message and exit —auth [AUTH] user and password —meta [META] meta file path —metaj [METAJ] metaj file path —interval INTERVAL the interval to make stream data —batch BATCH the interval to make stream data —workers WORKERS the interval to make stream data —version print the version number and exit —outprint print fake date to screen —outspliter OUTSPLITER print data, to split columns —locale LOCALE locale language —format FORMAT outprint and outfile format: json, text (default: text) —withheader print data or write data to file with column header

  1. <a name="0uYs1"></a>
  2. #### 安装对应数据库包
  3. 对于不同的数据库需要用到不同的python包,若在执行过程中报包缺失问题。 请pip安装对应包
  4. | 数据库 | python包 | 备注 |
  5. | --- | --- | --- |
  6. | mysql/tidb | mysql-python/mysqlclient | windows+python3请使用mysqlclient |
  7. | oracle | cx-Oracle | 同时需要下载orale相关库 |
  8. | postgresql/redshift | psycopg2 | 根据sqlachemy选择对应包 |
  9. | sqlserver | pyodbc | mssql+pyodbc |
  10. | Hbase | happybase,thrift | |
  11. | es | elasticsearch | |
  12. | hive | pyhive | |
  13. | kafka | kafka-python | |
  14. <a name="41LUe"></a>
  15. ### 三、快速上手
  16. <a name="Sxnxp"></a>
  17. #### 1. 示例meta源数据文件
  18. - **meta.txt**

id||int||自增id[:inc(id,1)] name||varchar(20)||学生名字[:name] age||int||年龄:[:random_int(20,60)] school||varchar(20)||学校名字[:enum(厦门大学,四川大学,武汉大学,北京大学,清华大学,中山大学,中南大学,南京大学,电子科技大学,浙江大学)] major||varchar(20)||专业[:enum(物联网工程,信息工程,土木工程,计算机软件工程,会计,工商管理)] company||varchar(20)||公司[:company] job||varchar(20)||职位[:job] phone||bigint||电话号码[:phone_number] email||varchar(64)||邮箱[:email] address||text||家庭地址[:address] credit_card_number||varchar(20)||卡号[:credit_card_number] password||varchar(20)||密码[:password] datetime||datetime||日期[:datetime] ip||varchar(32)||IP地址[:ipv4]

输出示例:
```bash
$datafaker file e:\zm\Py_Datafaker out.txt 1 --meta e:\zm\Py_Datafaker\meta.txt --outprint 

1,柴东,57,北京大学,信息工程,晖来计算机传媒有限公司,项目总监,15215107764,luyan@jing.org,山东省台北市华龙嘉禾街c座 618756,4714734019682,aaT@N8PbH+,2013-03-05 18:51:19,199.185.186.194
time used: 0.143 s
  • metaj.json
    {
      "name": "[:name]",
      "age": [:age],
      "school": {
          "sch_address": "[:address]",
          "scores": [
              {
                  "class": "[:enum(Math, English)]",
                  "score": [:decimal(4,2,1)],
                  "datatime": "[:datetime(1,%Y-%m-%d %H:%M:%S)]"
              }
          ]
      }
    },
    
    输出示例: ```bash $datafaker file e:\zm\Py_Datafaker out.json 1 —metaj e:\zm\Py_Datafaker\metaj.json —outprint

{ “name”: “王玉梅”, “age”: 52, “school”: { “sch_address”: “河南省帅县沈北新阜新路M座 102658”, “scores”: [ { “class”: “English”, “score”: 85.55, “datatime”: “2021-07-25 16:52:51” } ] } }, time used: 0.130 s

<a name="Iy8pw"></a>
#### 2. 写入File
前提:需要构造源数据文件`meta.txt`、如使用enum类型需要`names.txt`<br />json格式数据需要使用参数`--metaj`
```bash
datafaker file e:\zm\Py_Datafaker out.txt 1 --meta e:\zm\Py_Datafaker\meta.txt
datafaker file e:\zm\Py_Datafaker out.json 1 --metaj e:\zm\Py_Datafaker\metaj.json

3. 写入MySQL

  • 创建MySQL数据表
  • 根据数据表构造元数据文件meta.txt ```bash

    写入mysql 10条数据

    datafaker rdb mysql+mysqldb://root:root@localhost:3306/datafaker?charset=utf8 test 10 —meta meta.txt

批量写入mysql数据

datafaker rdb mysql+mysqldb://root:root@localhost:3306/datafaker?charset=utf8 test 100000 —meta meta.txt —worker 8 —batch 2000 ``` 更多示例请查看:DataFaker 官方文档

四、命令行参数

DataFaker参数包含4个必选参数和一些可选参数,如下表所示

参数名 含义 参数类型 是否必选 默认值 备注
dbtype 数据源类型 string 可选值为 rdb,mysql,hive, kafka, hbase, es, file
connect 数据源连接信息 string 关系型数据库和hive为 sqlachemy的连接串
kafka为broker连接串
file为文件路径
hbase为thrift host和端口
table 表名 string 将各种数据源操作单位都抽象为表,数据库中为表,kafka中为topic,file为文件名,hbase为表,es为索引和type,mongo为集合
num 数据条数 int
auth 账号密码 string 数据源的账号密码,以:分隔,例如 admin:12334
meta 元数据文件 string 若设定该参数,则忽略从数据源连接信息中读取远数据
metaj 元数据文件 string 自定义数据结构(一般用于json嵌套),metaj优先于meta参数
interval 流数据产生间隔 float 1 单位秒
version 显示版本号 bool
outprint 是否在屏幕打印 bool false 若设置屏幕打印,则数据不会写文件或数据源
outspliter 数据字段分割符 string , 屏幕打印,保存文件有效
locale 语言类型 string zh_CN 支持多国语言,en_US, zh_CN
format 数据格式 string text kafka 默认为json
withheader 打印和存储到文件是否带表头 bool False
batch 每次批量写入数据源大小 int 1000
workers 生成测试数据的线程数 int 4

五、数据构造规则

1. 数据库常用类型

这部分数据类型可以不用指定元数据文件

  • 数值类型 支持大部分标准SQL数值数据类型。 这些类型包括严格数值数据类型( int、integer、smallint、decimal和numeric),以及近似数值数据类型(float、real和double, precision)
  • 日期和时间类型 表示时间值的日期和时间类型为datetime、date、timestamp、time和year。
  • 字符串类型 字符串类型指char、varchar、binary、varbinary、blob、text、enum和set。

    2. 可变数据库类型


类型名 含义 默认值 备注
decimal(M,D, negative, min, max) M指定总的数据位数,D指定小数位数, negative指定正1负0, min,max为最小最大值(必须为整数) decimal(4, 2, 1, 70,90)指定4位数,2位小数的正浮点数,如78.23
string(min, max) min, max 指定字符串位数范围
date(start, end) start, end 指定日期范围 如date(1990-01-01, 2019-12-12)

自增类型

inc(mark, start, step)
mark: 自增的变量名
start: 起始值, 默认值为1
step: 自增步长,默认值为1
inc(id)表示将当前列名为id的列,从1开始每次增长1, 可用于mysql的自增主键
inc(score, 100, 2)表示将当前列名为score的列,从100开始每次增长2

enum类型

enum类型表示随机从列表里随机选取一个对象,例如:
enum(2, 4, 5, 18) 表示每次从2,4,5,8这四个整数中随机选择一个
如果enum数组中只有一个对象,则表示从文件读取数据列表,每行一个对象:
enum(file://data.txt) 表示从当前目录的data.txt文件中读取列表。
enum类型可用来构造多表关联,比如两个表的某些字段都用同一个enum数据列表产生数据。

order_enum类型

与enum类型使用方法相同
不同在于,用于循环顺序产生枚举值。常用于相关联的多列产生值,例如一列为城市编码,一列为城市名,城市编码需要与城市名一一对应。关联的多列应该保持枚举值数量一致。
注意:由于多线程,不保证顺序严格按照枚举值列表顺序依次产生。但是能保证多相关列一一对应
详细请搜索查看issues

op类型

op类型表示从其他列中计算出值,例如:
op(c0+c3) 表示第一列值加上第四列值
op(c1*c4+c13) 表示第一列值乘上第五列值加上第十四列值

3. 自定义扩展类型

address 地址

构造规则 含义 举例 备注
country 国家名 中国
province 省份 河南
city 城市名 郑州市
city_suffix 城市的后缀 市或县
address 地址 河北省巢湖县怀柔南宁路f座 169812
country_code 国家编码 AO
district 普陀
latitude 地理坐标(纬度) 68.0228435
longitude 地理坐标(经度) 155.964341
postcode 邮编 803511
street_address 街道地址 邯郸路W座
street_name 街道名 合肥路
street_suffix 街、路

数值类型

构造规则 含义 举例 备注
random_digit 0~9随机数 1
random_digit_not_null 1~9的随机数 9
random_element 随机字母 a
random_int 随机数字 44 可设置范围,可以通过设置min,max来设置,默认0~9999,例如random_int(1,100)
random_letter 随机字母 e
random_number 随机数字 参数digits设置生成的数字位数 例如random_number(2)生成2为数数字
boolean True/False False
numerify 三位随机数字 934
number 一定数位的数字 44322 number(digits=None, fix_len=0, positive=0)有三个参数,digits表示多少位数字,fix_len表示是否固定长度(1表示固定长度,否则为1到digits长度)positive表示是否为正数(1为正数,-1为负数,0正负都可能)。number(18, 1, 1) 产生18位数固定长度的正整数

公司

构造规则 含义 举例 备注
bs 公司服务名 transition open-source content
company 公司名(长) 天开信息有限公司
company_prefix 公司名(短) 浦华众城
company_suffix 公司性质 传媒有限公司
job 职位 项目执行/协调人员

信用卡、货币

构造规则 含义 举例 备注
credit_card_expire 信用卡到期日 05/19
credit_card_full 完整信用卡信息 JCB 16 digit 霞 张 3514193766205948 08/21CVC: 436
credit_card_number 信用卡号 3500011993590161
credit_card_provider 信用卡类型 American Express
credit_card_security_code 信用卡安全码 190
currency_code 货币编码 HNL
  • 日期、时间 | 构造规则 | 含义 | 举例 | 备注 | | —- | —- | —- | —- | | am_pm | AM/PM | AM | | | century | 世纪 | VII | | | date | 随机日期 | 2014-05-18 | date(start_date,end_date,format)
    start_date表示从当前日期往前推的天数,默认值为-30y,前30年,
    end_date表示从当前日期往后推的日期数,默认值为今天
    format为日期格式,默认值为%Y-%m-%d
    例如date(-30d, +20d, %Y.%m.%d) | | date_between
    0.7.4版本不可用 | 指定范围内日期 | 1997-08-29 | date_between(start_date,end_date,format)
    start_date表示开始日期,必填
    end_date表示结束日期,必填
    format为日期格式,默认值为%Y-%m-%d
    date_between(2017-01-01, 2019-12-02, %Y%m%d) | | date_this_month | 当前月份的日期 | 2019-03-13 | | | date_this_year | 今年内的日期 | 2019-03-09 | | | date_time/datetime | (1970年1月1日至今)时间 | 可不带参数datetime, 或者带参数datetime(0)随机时间, datetime(1,%Y-%m-%d %H:%M) 数据产生时间 2010-06-15 04:07 | datetime(now,format)两个参数:now(0,1是否用当前时间, 默认为0表示随机事件,1为当前时间), format(时间格式 默认为%Y-%m-%d %H:%M:%S) | | datetime_between | 指定范围时间 | 2009-10-03 03:15:07 | datetime_between(sdt, edt, foramt=’%Y-%m-%d %H:%M:%S’), sdt、edt为起止时间,格式为%Y-%m-%d %H:%M:%S,format为输出时间格式。datetime_between(‘2019-04-14 00:00:00’, ‘2019-04-15 00:00:00’)输出为2019-04-14 00:55:07 | | month | 随机月份 | 05 | | | month_name | 随机月份(英文) | December | | | time() | 随机24小时时间 | 18:52:55 | | | timezone | 随机时区 | Europe/Andorra | | | unix_time | 随机Unix时间 | 203461583 | | | timestamp | 随机Unix时间 | timestamp/timestamp(0) 随机时间戳, timestamp(1)当前数据产生时间戳 | 带一个参数 默认为0 | | year | 随机年份 | 2017 | |

internet

构造规则 含义 举例 备注
file_extension 文件扩展名 wav
file_name 文件名(包含扩展名,不包含路径) werwe.jpg
file_path 文件路径(包含文件名,扩展名) /home/
mime_type mime Type video/x-flv
company_email 公司邮箱 jieyan@14.cn
domain_name 域名 jq.cn
email 邮箱 kren@wei.cn
image_url 随机URL地址 https://www.lorempixel.com/470/178
ipv4 IP4地址 192.0.25.141
ipv6 IP6地址 206f:1ff0:374:2d5f:a6f8:69ef:4ba9:2d14
mac_address MAC地址 65:02:ed:82:c6:98
tld 网址域名后缀(.com,.net.cn,等等,不包括.) cn
uri URI地址 http://24.cn/
url URL地址 http://www.guiyinglei.cn/
user_name 用户名 ping51
user_agent 随机user_agent信息
chrome Chrome浏览器user_agent信息 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/5342 (KHTML, like Gecko) Chrome/27.0.819.0 Safari/5342
firefox FireFox浏览器user_agent信息
internet_explorer IE浏览器user_agent信息
opera Opera浏览器user_agent
safari Safari浏览器user_agent信息
linux_platform_token 随机Linux信息 X11; Linux i686
isbn10 随机ISBN(10位) 1-02-136461-4
isbn13 随机ISBN(13位) 978-0-15-215169-0

文本类型

构造规则 含义 举例 备注
paragraph 随机生成一个段落
sentence 随机生成一句话
text 随机生成一篇文章 不要幻想着人工智能了,至今没完全看懂一句话是什么意思
word 随机生成词语 hello
locale 随机生成语言/国际信息 niu_NZ 各国本地化编码
md5 随机生成MD5 fd80f4681258a9ecb329ab12782dfbba
password 随机生成密码 )we3JViVB1 可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母
sha1 随机SHA1 e9bb2fcd4b4089cc89c36636850ceafe779dbe58
sha256 随机SHA256 dd119cb2aec9b3d5557e56bb497757d42f82b32486ea92126942821d3b657957
uuid4 随机UUID 04aff886-8482-4069-9260-7917fd83982d

人物信息相关

构造规则 含义 举例 备注
name 全名 单玉珍
name_female 男性全名 官平
name_male 女性全名 许颖
first_name
last_name
first_name_female 女名
last_name_female 女姓
first_name_male 男名
last_name_male 男姓
age 人年龄 23 默认值 0-100
ssn 身份证号 350526193807198690
phone_number 手机号 13926798387
phonenumber_prefix 手机号段 157
profile 档案信息
simple_profile 简单档案信息 {‘username’: u’kcui’, ‘name’: u’\u5415\u67f3’, ‘birthdate’: datetime.date(1993, 3, 28), ‘sex’: ‘F’, ‘address’: u’\u9752\u6d77\u7701\u4e0a\u6d77\u53bf\u6881\u5e73\u5174\u5b89\u76df\u8defQ\u5ea7 532381’, ‘mail’: u’juanpan@hotmail.com‘}

其他杂项

构造规则 含义 举例 备注
color_name 随机颜色名 Moccasin
hex_color 随机HEX颜色 #7f7cb6
rgb_color 随机RGB颜色 210,85,105

六、注意事项

1. Datafaker 已知BUG

移步issue https://github.com/gangly/datafaker/issues/81

2. 构造大批量数据

若需要构造大批量数据,原生python将耗费大量时间,请使用pypy执行datafaker。例如:
pypy -m datafaker hbase localhost:9090 PIGONE 50000 --meta hbase.txt
或者多线程执行, 8个线程产生数据,每次批量写入pg 2000条数据:
datafaker mysql postgresql+psycopg2://postgres:postgres@localhost/testpg pig_fnumbe_test 100000 --meta meta.txt --worker 8 --batch 2000

3. 支持关系型数据库

例子中大部分是以mysql为例子展示的。 只要支持sqlachemy的关系型数据库都是可以的,例如pg, oracle, tidb,redshift等等。 但type类型都是rdb,例如: datafaker rdb postgresql+psycopg2://postgres:postgres@localhost/testpg pig_fnumbe_test 100000 --meta meta.txt --worker 8 --batch 2000
写入oracle datafaker rdb oracle://root:root@127.0.0.1:1521/helowin stu 10 --meta meta.txt
sqlalchemy连接串必须为oracle:形式

4. 间隔写入数据

需要设置interval和batch参数,例如: datafaker rdb postgresql+psycopg2://postgres:postgres@localhost/testpg pig_fnumbe_test 100000 --meta meta.txt --interval 0.5 --batch 1