造数据,别慌!使用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 Faker
  Downloading 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 Faker

class 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)
    # 写入txt
    def 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 Faker

import psycopg2

class 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)
    # 写入txt
    def 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 - 大规模随机数据生成方法

### 关于 Doris 数据库生成工具或数据生成 Doris 是一种高性能的分布式数据分析型数据库,广泛应用于实时分析场景。为了满足测试需求或者模拟生产环境中的大规模数据量,通常会借助一些专门设计的数据生成工具来创建符合特定模式和分布特性的数据。 #### 1. **Apache DBGen 工具** 对于 Doris 或其他类似的 OLAP 数据库来说,可以利用 Apache DBGen 这样的开源工具生成大量具有实际意义的测试数据[^5]。DBGen 原本是为了 TPC-H 测试基准而开发的一个程序包,它可以按照指定的比例因子(Scale Factor, SF)生成一系列标准的关系型表格及其对应的内容。尽管它最初针对的是传统的 RDBMS 系统,但由于其灵活性高以及能够提供丰富的业务逻辑背景下的样本记录,所以也被移植到了多种现代存储引擎上使用。 #### 2. **自定义脚本方式** 如果现有的通用解决方案无法完全匹配项目具体要求,则可以通过编写 Python/Java 脚本来实现定制化的随机序列填充过程。例如,在 Pandas 库的帮助下快速构建 DataFrame 并将其写入 CSV 文件供后续导入至 Doris 表格中: ```python import pandas as pd import numpy as np data = { 'id': range(1, 1001), 'name': ['User' + str(i) for i in range(1, 1001)], 'age': np.random.randint(low=18, high=60, size=(1000,)) } df = pd.DataFrame(data) # Save to csv file which can be loaded into Doris later. df.to_csv('users.csv', index=False) ``` 此方法允许开发者精确控制每一列的数据类型、范围以及其他属性特征,从而更好地适配下游应用层面对输入源的质量预期。 #### 3. **Faker 类库辅助伪真实感强的信息条目** Python 社区维护了一个名为 `faker` 的第三方模块,专攻制假名地址电话号码电子邮件等个人信息片段的同时还能兼顾多国语言支持特性。结合上述提到的手动编码技巧一起运用的话,就可以轻松打出既具备统计学意义上的合理性又贴近日常生活情境的大批量虚拟客户档案集合了。 安装命令如下所示: ```bash pip install faker ``` 一段简单的演示代码可能看起来像这样子: ```python from faker import Faker fake = Faker() records = [{'full_name': fake.name(), 'email': fake.email()} for _ in range(10)] print(records[:2]) ``` 输出结果类似于: ```plaintext [{'full_name': 'John Doe', 'email': 'john.doe@example.com'}, {'full_name': 'Jane Smith', 'email': 'jane.smith@sample.org'}] ``` 这些由 Faker 提供的功能非常适合用来充实那些需要展示给最终用户的界面原型或者是训练机器学习模型所需的标注样例集等方面的应用场合。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iihero

谢谢打赏,不断前行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值