当前位置:   article > 正文

造数据,别慌!使用python faker创建大批量随机测试数据_faker python库测试造数

faker python库测试造数

前言

在数据库的使用过程中,有很多场合是要自行去构造大规模数据,以供测试、性能功能验证使用。我在前边一文:PostgreSQL - 大规模随机数据生成方法里介绍了PostgreSQL中生成大规模随机数据的方法。这种方法,生成数据比较快,但是数据大多是对业务场景没有太大意义的数据,或者说对业务不够友好。

本文再介绍通过一些第三方库,插入一些相对友好的随机数据 。那就是通过Python faker库来生成数据 。Faker是一个Python软件包,可为您生成伪造数据。无论您是需要引导数据库,创建美观的XML文档,填充持久性以进行压力测试还是匿名化来自生产服务的数据,Faker都是您的理想之选之一。不论您这边需要创建多少条数据,无非是一个for循环就解决问题了。

实作

基本安装

使用pip安装即可 pip install Faker

  1. pip -V
  2. pip 21.3.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
  3. pip install Faker
  4. Defaulting to user installation because normal site-packages is not writeable
  5. Collecting Faker
  6.   Downloading Faker-14.2.1-py3-none-any.whl (1.6 MB)
  7.      |████████████████████████████████| 1.6 MB 1.1 MB/s
  8. Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.6/site-packages (from Faker) (4.1.1)
  9. Requirement already satisfied: python-dateutil>=2.4 in /usr/local/lib/python3.6/site-packages (from Faker) (2.8.2)
  10. Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/site-packages (from python-dateutil>=2.4->Faker) (1.16.0)
  11. Installing collected packages: Faker
  12. ........................

github地址:https://github.com/joke2k/faker  可以直接从tags里找到各个版本的Faker下载。https://github.com/joke2k/faker/tags

API简介

我们可以用dir(fake)查看一下,它能fake近300种东西出来,并且faker还支持上几十种语言简直不能太强大。

简单示例:

  1. >>> from faker import Faker
  2. >>> fake = Faker('zh_CN')
  3. >>> fake.country()
  4. '福克兰群岛'
  5. >>> fake.country()
  6. '日本'
  7. >>> fake.country()
  8. '以色列'
  9. >>> fake.country()
  10. '保加利亚'
  11. >>> fake.country()
  12. '马拉维'

下边以PostgreSQL数据库为例,看看如何用Faker方便的生成数据,  设有表:

  1.  create table customer(id bigserial primary key, name varchar(32) not null, job varchar(64),
  2.       company varchar(128), phone_num varchar(24), email varchar(128), address varchar(128));

下面我们可以用Faker直接造些数据.

方式一:直接生成数据文件

  1. # -*- coding:utf-8 -*-
  2. from faker import Faker
  3. class DataGenerator(object):
  4.     def __init__(self):
  5.         # 选择中文
  6.         fake = Faker('zh_CN')
  7.         # 生成数据改变循环体来控制数据量rang(?)
  8.         self.data_total = [
  9.             [fake.name(), fake.job(), fake.company(), fake.phone_number(), fake.company_email(), fake.address(),
  10.              fake.date_time(tzinfo=None)] for x in range(100)] 
  11.         print(self.data_total)
  12.     # 写入txt
  13.     def deal_txt(self):
  14.         with open('data_total.txt''w', errors='ignore', encoding='utf-8'as output:
  15.             output.write('name,job,company,phone_number,company_email,address\n')
  16.             for row in self.data_total:
  17.                 rowtxt = '{},{},{},{},{},{}'.format(row[0], row[1], row[2], row[3], row[4], row[5], row[6])
  18.                 output.write(rowtxt)
  19.                 output.write('\n')
  20.             output.close()
  21.         print("Processing completed to txt")
  22. if __name__ == '__main__':
  23.     data = DataGenerator()
  24.     data.deal_txt()

运行python3 datagen.py,我们打开数据文件:data_total.txt,  能看到100条数据:

  1. name,job,company,phone_number,company_email,address
  2. 裴婷,产品专员,华泰通安科技有限公司,15540283808,weijin@guiyingyin.cn,江苏省潮州市和平深圳街f座 815057
  3. 陈成,激光/光电子技术,毕博诚网络有限公司,15983545054,xyan@xiuyingjing.cn,新疆维吾尔自治区莹市梁平毛街T座 733404
  4. 王兰英,水质检测员,创汇网络有限公司,13732772337,chao42@yansu.cn,浙江省哈尔滨县秀英深圳街g座 828060
  5. 陈秀梅,寻呼员/话务员,凌颖信息网络有限公司,15181833465,sgu@liyong.cn,宁夏回族自治区鹏县门头沟陈路W座 179856
  6. ...............

既然文件有了,使用\copy命令,可以秒入数据到表CUSTOMER中:

  1. mydb=# \copy customer(name, job, company, phone_num, email, addressfrom '/iihero/source/faker/data_total.txt' with csv header;
  2. COPY 100

看看效果:

样例数据生成

方式二:直接边生成数据边入库

我们把上边的代码稍改动一下, 加入连接pg并入库的操作

  1. pip3 install psycopg2-binary
  2. # -*- coding:utf-8 -*-
  3. from faker import Faker
  4. import psycopg2
  5. class DataGenerator(object):
  6.     def __init__(self):
  7.         # 选择中文
  8.         fake = Faker('zh_CN')
  9.         # 生成数据改变循环体来控制数据量rang(?)
  10.         self.data_total = [
  11.             [fake.name(), fake.job(), fake.company(), fake.phone_number(), fake.company_email(), fake.address(),
  12.              fake.date_time(tzinfo=None)] for x in range(100)] 
  13.         print(self.data_total)
  14.     # 写入txt
  15.     def deal_txt(self):
  16.         with open('data_total.txt''w', errors='ignore', encoding='utf-8'as output:
  17.             output.write('name,job,company,phone_number,company_email,address\n')
  18.             for row in self.data_total:
  19.                 rowtxt = '{},{},{},{},{},{}'.format(row[0], row[1], row[2], row[3], row[4], row[5])
  20.                 output.write(rowtxt)
  21.                 output.write('\n')
  22.             output.close()
  23.         print("Processing completed to txt")
  24.     def deal_pg(self):
  25.         # 打开数据库连接
  26.         db = psycopg2.connect(database="mydb", user="mydb", password="test123", host="127.0.0.1", port="5555")
  27.         print("Opened database successfully")
  28.         # 使用cursor()方法获取操作游标
  29.         cursor = db.cursor()
  30.         # SQL 插入语句
  31.         for val in self.data_total:
  32.             sql = "insert into customer(name,job,company,phone_num,email,address) values ('%s','%s','%s','%s','%s','%s')" % (
  33.                 val[0], val[1], val[2], val[3], val[4], val[5])
  34.             try:
  35.                 # 执行sql语句
  36.                 cursor.execute(sql)
  37.                 # 执行sql语句
  38.                 db.commit()
  39.                 print("insert ok")
  40.             except(Exception, psycopg2.DatabaseError) as error:
  41.                 print(error)
  42.                 # 发生错误时回滚
  43.                 db.rollback()
  44.         # 关闭数据库连接
  45.         db.close()
  46.     def deal_pg_direct(self):
  47.         fake = Faker('zh_CN')
  48.         # 打开数据库连接
  49.         db = psycopg2.connect(database="mydb", user="mydb", password="test123", host="127.0.0.1", port="5555")
  50.         print("Opened database successfully")
  51.         # 使用cursor()方法获取操作游标
  52.         cursor = db.cursor()
  53.         # SQL 插入语句
  54.         for x in range(1000):
  55.             sql = "insert into customer(name,job,company,phone_num,email,address) values ('%s','%s','%s','%s','%s','%s')" % (
  56.                 fake.name(), fake.job(), fake.company(), fake.phone_number(), fake.company_email(), fake.address())
  57.             try:
  58.                 # 执行sql语句
  59.                 cursor.execute(sql)
  60.                 # 执行sql语句
  61.                 db.commit()
  62.                 print("insert ok")
  63.             except(Exception, psycopg2.DatabaseError) as error:
  64.                 print(error)
  65.                 # 发生错误时回滚
  66.                 db.rollback()
  67.         # 关闭数据库连接
  68.         db.close()
  69. if __name__ == '__main__':
  70.     data = DataGenerator()
  71.     data.deal_pg()

我们先使用粗糙的deal_pg()方法,从内存的100条取出依次插入。你可以很顺利的看到100条插入到数据库当中。

优化一下,可以直接边fake数据边插入,那样内存开销极小。

当然,我们还可以进一步优化,就是每次插入绑定多条,那样性能还会好一些。本文的目的不在于此,在于快速生成数据的方法。

总结

Faker这个工具库,应该是一个通用的工具。对于某些DBMS缺乏必要的生成函数,我们可以用Faker快速生成较大规模的数据文件,然后一次性导入,也不失为一种方法。或者直接往库表里头灌入。

PostgreSQL又多了一种快速生成数据的方法,而且是对人友好可读的。

相关文档参考:

1、https://faker.readthedocs.io/en/master/
2、https://www.cnblogs.com/felixwang2/p/9246279.html (具体函数运用)

图片

相关文章导读:
1. PostgreSQL - 大规模随机数据生成方法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/927196
推荐阅读
相关标签
  

闽ICP备14008679号