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

前言

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

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

实作

基本安装

使用pip安装即可 pip install Faker

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

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

API简介

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

简单示例:

>>> from faker import Faker
>>> fake = Faker('zh_CN')
>>> fake.country()
'福克兰群岛'
>>> fake.country()
'日本'
>>> fake.country()
'以色列'
>>> fake.country()
'保加利亚'
>>> fake.country()
'马拉维'

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

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

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

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

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

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

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

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

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

看看效果:

样例数据生成

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

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

pip3 install psycopg2-binary# -*- coding:utf-8 -*-from faker import Fakerimport psycopg2class DataGenerator(object):def __init__(self):# 选择中文fake = Faker('zh_CN')# 生成数据改变循环体来控制数据量rang(?)self.data_total = [[fake.name(), fake.job(), fake.company(), fake.phone_number(), fake.company_email(), fake.address(),fake.date_time(tzinfo=None)] for x in range(100)] print(self.data_total)# 写入txtdef deal_txt(self):with open('data_total.txt', 'w', errors='ignore', encoding='utf-8') as output:output.write('name,job,company,phone_number,company_email,address\n')for row in self.data_total:rowtxt = '{},{},{},{},{},{}'.format(row[0], row[1], row[2], row[3], row[4], row[5])output.write(rowtxt)output.write('\n')output.close()print("Processing completed to txt")def deal_pg(self):# 打开数据库连接db = psycopg2.connect(database="mydb", user="mydb", password="test123", host="127.0.0.1", port="5555")print("Opened database successfully")# 使用cursor()方法获取操作游标cursor = db.cursor()# SQL 插入语句for val in self.data_total:sql = "insert into customer(name,job,company,phone_num,email,address) values ('%s','%s','%s','%s','%s','%s')" % (val[0], val[1], val[2], val[3], val[4], val[5])try:# 执行sql语句cursor.execute(sql)# 执行sql语句db.commit()print("insert ok")except(Exception, psycopg2.DatabaseError) as error:print(error)# 发生错误时回滚db.rollback()# 关闭数据库连接db.close()def deal_pg_direct(self):fake = Faker('zh_CN')# 打开数据库连接db = psycopg2.connect(database="mydb", user="mydb", password="test123", host="127.0.0.1", port="5555")print("Opened database successfully")# 使用cursor()方法获取操作游标cursor = db.cursor()# SQL 插入语句for x in range(1000):sql = "insert into customer(name,job,company,phone_num,email,address) values ('%s','%s','%s','%s','%s','%s')" % (fake.name(), fake.job(), fake.company(), fake.phone_number(), fake.company_email(), fake.address())try:# 执行sql语句cursor.execute(sql)# 执行sql语句db.commit()print("insert ok")except(Exception, psycopg2.DatabaseError) as error:print(error)# 发生错误时回滚db.rollback()# 关闭数据库连接db.close()if __name__ == '__main__':data = DataGenerator()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 - 大规模随机数据生成方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/617037.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode34:在排序数组中查找元素的第一个和最后一个位置(Java)

目录 题目: 题解: 方法一: 方法二: 题目: 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&…

AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)

目录 前言 一、为什么要做智能评估? 二、Ragas是什么? 三、Ragas使用场景 四、Ragas评估指标 五、Ragas代码实践 总结 前言 随着人工智能技术的飞速发展,AI大模型(LLM)已经成为了推动技术创新和应用的关键因素。…

数模 初见数建

文章目录 初见数学建模1.1 数学建模是什么1.2 数学建模的概述1.3 如何学习数学建模---分模块化1.4 数学建模前提了解1.5 数学建模的六个步骤1.6 如何备战建模比赛1.7 数学建模赛题类型1.8 数学建模算法体系概述 初见数学建模 1.1 数学建模是什么 1.原型与模型 原型&#xff…

Golang | Leetcode Golang题解之第28题找出字符串中第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; func strStr(haystack, needle string) int {n, m : len(haystack), len(needle)if m 0 {return 0}pi : make([]int, m)for i, j : 1, 0; i < m; i {for j > 0 && needle[i] ! needle[j] {j pi[j-1]}if needle[i] needle[…

AI图书推荐:如何在课堂上使用ChatGPT 进行教育

ChatGPT是一款强大的新型人工智能&#xff0c;已向公众免费开放。现在&#xff0c;各级别的教师、教授和指导员都能利用这款革命性新技术的力量来提升教育体验。 本书提供了一个易于理解的ChatGPT解释&#xff0c;并且更重要的是&#xff0c;详述了如何在课堂上以多种不同方式…

程序猿没有副业,太难了

副业的初衷 我知道踏下心来钻研本专业会有收获,但又实在没有太多兴趣。 只好努努力,跟着兴致走,多一个选择,多一份抵抗风险的能力。 不管从事什么行业&#xff0c;除了做好自己本职工作以外&#xff0c;还会有一些空闲的时间来做一些其他事情&#xff0c;与其说是副业,不如说…

TypeScript 忽略红色波浪线

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

upload-labs第五六关

第五关 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml"…

《手机维修600G资料》云盘下载地址

无意中发现一个生财之道&#xff0c;哈哈哈&#xff0c;就是发现有人在一些视频平台&#xff0c;发手机维修之类的视频吸引客户。这样自己就不用开店也可以接生意了。问题剩下就一个了&#xff0c;把手机维修技术学好&#xff0c;一技在手&#xff0c;天上我有。 《手机维修600…

基于java+springboot+vue实现的智能停车计费系统(文末源码+Lw+ppt)23-30

摘 要 随着人们生活水平的高速发展&#xff0c;智能停车计费信息管理方面在近年来呈直线上升&#xff0c;人们也了解到智能停车计费的实用性&#xff0c;因此智能停车计费的管理也逐年递增&#xff0c;智能停车计费信息的增加加大了在管理上的工作难度。为了能更好的维护智能…

单路高清HDMI编码器JR-3211HD

产品简介&#xff1a; JR-3211HD单路高清HDMI编码器是专业的高清音视频编码产品&#xff0c;该产品具有支持1路高清HDMI音视频采集功能&#xff0c; 1路3.5MM独立外接音频输入&#xff0c;编码输出双码流H.264格式&#xff0c;音频MP3/AAC格式。编码码率可调&#xff0c;画面质…

TQ15EG开发板教程:在MPSOC上运行ADRV9009(vivado2018.3)

首先需要在github上下载两个文件&#xff0c;本例程用到的文件以及最终文件我都会放在网盘里面&#xff0c; 地址放在最后面。在github搜索hdl选择第一个&#xff0c;如下图所示 GitHub网址&#xff1a;https://github.com/analogdevicesinc/hdl/releases 点击releases选择版…