出于测试目的,特别是如果您正在处理一个使用任何数据库技术来存储信息的项目,您可能需要数据来测试您的项目。在这种情况下,您有两个选择:
- 找一个好的数据集(Kaggle)或者,
- 使用像Faker这样的库
通过这篇博文,你将学习如何使用Faker为MySQL生成测试数据。
需求
依赖关系
在创建为项目生成数据的Python脚本之前,请确保安装了所有依赖项。
你可以创建一个让包含以下内容的文件:
|
1
2
3.
4
5
|
熊猫
sqlalchemy
PyMySQL
tqdm
骗子
|
创建完这个文件后,运行以下命令:
|
1
|
皮普
安装
-r
需求
. txt
|
或者如果你正在使用Anaconda,创建一个environment.yml文件:
|
1
2
3.
4
5
6
7
8
|
名字: 雷竞技下载官网percona
依赖关系:
-python = 3。10
-熊猫
-sqlalchemy
-PyMySQL
-tqdm
-骗子
|
您可以更改Python版本,因为该脚本已被证明可以使用以下版本的Python: 3.7、3.8、3.9、3.10和3.11。
运行如下语句配置项目环境:
|
1
|
conda
env
创建
-f
环境
.yml
|
数据库
既然已经安装了依赖项,就必须创建一个名为公司。
登录MySQL:
|
1
|
mysql
-u
根
-p
|
或者使用MySQL Shell登录MySQL:
|
1
|
mysqlsh
根
@
本地主机
|
取代根输入您的用户名,如有必要,并替换本地主机如果需要,使用MySQL服务器实例的IP地址或URL。
如果使用MySQL Shell,请切换到SQL模式:
|
1
|
\
sql
|
然后创建公司数据库
|
1
|
创建
数据库
公司;
|
用Faker伪造数据
骗子是一个Python库,可用于通过包中定义的属性生成假数据。
|
1
2
3.
4
5
|
从
骗子
进口
骗子
假的
=
骗子
(
)
为
_
在
范围
(
10
)
:
打印
(
假的
。
名字
(
)
)
|
上面的代码将在每次调用方法时打印10个名称名称(),它将产生一个随机值。的名称()是生成器的一个属性。这个库的每个属性都称为a假的。其中有很多是包装在供应商。
Faker库中可用的一些提供程序和属性包括:
- faker.providers.person
- 名字→John Doe
- first_name→凯瑟琳
- last_name→常
- faker.providers.address
- 地址→791克里斯公园,萨沙伯里,伊利诺伊州86039-9874
- 城市→Sashabury
- 国家→匈牙利
- faker.providers.job
- 工作→音乐家
- faker.providers.company
- 公司→Acme公司
- faker.providers.internet
创建一个Pandas数据框架
在了解了Faker及其性质后模块目录需要被创建,在目录中,我们将创建一个名为dataframe.py。稍后将把该模块导入到主脚本中,并在这里定义将生成数据的方法。
|
1
2
3.
4
|
从
多处理
进口
cpu_count
进口
熊猫
作为
pd
从
tqdm
进口
tqdm
从
骗子
进口
骗子
|
实现多处理是为了优化脚本的执行时间,但稍后将对此进行解释。首先,您需要导入所需的库:
- 熊猫。使用Faker生成的数据将在导入数据库之前存储在Pandas DataFrame中。
- tqdm ()。需要添加进度条来显示DataFrame创建的进度。
- 骗子()。这是伪造库里的发生器。
- cpu_count ()。的方法多处理模块,该模块将返回可用内核的数量。
|
1
2
|
假的
=
骗子
(
)
num_cores
=
cpu_count
(
)
-
1
|
骗子()创建并初始化faker生成器,该生成器可以通过访问属性生成数据。
num_cores变量是否存储调用后返回的值cpu_count ()方法。
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
|
def
create_dataframe
(
参数
)
:
x
=
int
(
60000/num_cores
)
数据
=
pd
。
DataFrame
(
)
为
我
在
tqdm
(
范围
(
x
)
,
desc=“创建DataFrame”
)
:
数据
。
疯狂的
[
我
,
“first_name”
]
=
假的
。
first_name
(
)
数据
。
疯狂的
[
我
,
“last_name”
]
=
假的
。
last_name
(
)
数据
。
疯狂的
[
我
,
“工作”
]
=
假的
。
工作
(
)
数据
。
疯狂的
[
我
,
“公司”
]
=
假的
。
公司
(
)
数据
。
疯狂的
[
我
,
“地址”
]
=
假的
。
地址
(
)
数据
。
疯狂的
[
我
,
“城市”
]
=
假的
。
城市
(
)
数据
。
疯狂的
[
我
,
“国家”
]
=
假的
。
国家
(
)
数据
。
疯狂的
[
我
,
“电子邮件”
]
=
假的
。
电子邮件
(
)
返回
数据
|
然后我们定义create_dataframe ()函数,地点:
- x是一个变量,它将决定创建DataFrame的for循环的迭代次数。
- 数据是一个空的DataFrame,稍后将使用Faker生成的数据来实现。
- 熊猫DataFrame.loc属性提供了对一组行和列的标签访问。在每次迭代中,一行数据被添加到DataFrame中,该属性允许为每一列赋值。
调用此函数后创建的DataFrame将包含以下列:
|
1
2
3.
4
5
6
7
8
9
10
|
# Column Non-Null Count
---------
-------------------
0
first_name
60000
非-零
对象
1
last_name
60000
非-零
对象
2
工作
60000
非-零
对象
3.
公司
60000
非-零
对象
4
地址
60000
非-零
对象
5
国家
60000
非-零
对象
6
城市
60000
非-零
对象
7
电子邮件
60000
非-零
对象
|
连接到数据库
在插入之前由Faker生成的数据之前,我们需要建立到数据库的连接,为此将使用SQLAlchemy库。
SQLAlchemy是Python SQL工具包和对象关系映射器,它为应用程序开发人员提供了SQL的全部功能和灵活性。
|
1
2
3.
4
5
|
从
sqlalchemy
进口
create_engine
从
sqlalchemy
。
orm
进口
sessionmaker
会话
=
sessionmaker
(
绑定=引擎
)
|
从SQLAlchemy中导入create_engine ()以及sessionmaker()方法。第一个用于连接到数据库,第二个用于创建到引擎对象的会话绑定。
别忘了更换用户,密码,和本地主机使用您的身份验证详细信息,将此代码保存在模块目录并命名base.py。
从文档, SQLAlchemy使用mysqlclient库,但也有其他可用的,包括PyMySQL。
维修工说的两种mysqlclient和PyMySQL, mysqlclient-python比PyMySQL快得多,但如果:
- 由于某些原因,你不能使用libmysqlclient
- 你想使用monkeypatched socket的gevent或eventlet
- 你想破解mysql协议
数据库模式定义
方法创建数据库的模式模式定义语言由SQLAlchemy提供,但因为我们只创建一个表并通过调用Pandas导入DataFrameto_sql ()方法,这是不必要的。
在调用to_sql()方法时,我们按照如下方式指定模式:
|
1
2
3.
4
5
6
7
8
9
10
11
12
|
从
sqlalchemy
。
类型
进口
*
模式
=
{
“first_name”
:
字符串
(
50
)
,
“last_name”
:
字符串
(
50
)
,
“工作”
:
字符串
(
One hundred.
)
,
“公司”
:
字符串
(
One hundred.
)
,
“地址”
:
字符串
(
200
)
,
“城市”
:
字符串
(
One hundred.
)
,
“国家”
:
字符串
(
One hundred.
)
,
“电子邮件”
:
字符串
(
50
)
}
|
然后我们通过模式变量作为此方法的参数。
将此代码保存在模块目录名称为schema.py。
什么是多处理?
多处理是一个Python模块,可用于利用运行脚本的计算机中可用的CPU内核。在Python中,单cpu使用是由全局解释器锁,它只允许一个线程在任何给定时间携带Python解释器,有关更多信息,请参阅这篇博文。
假设您正在生成60,000条记录,那么在单个核心中运行脚本将花费比预期更多的时间,因为每个记录都是在循环中逐一生成的。通过实现多处理,整个过程除以核心数量,因此如果您的CPU有16个核心,每个核心将生成4,000条记录,这是因为只有15个核心将被使用,因为我们需要留下一个可用以避免计算机冻结。
为了更好地理解如何在Python中实现多处理,我推荐以下教程:
生成数据
现在,所有必需的模块都准备好了,可以导入到主脚本中sql.py脚本。首先,导入所需的库:
|
1
2
3.
|
从
多处理
进口
池
从
多处理
进口
cpu_count
进口
熊猫
作为
pd
|
从多处理,池()和cpu_count ()是必需的。的Python多处理池类允许您在Python中创建和管理进程池。
然后,导入之前创建的模块:
|
1
2
3.
|
从
模块
。
dataframe
进口
create_dataframe
从
模块
。
模式
进口
模式
从
模块
。
基地
进口
会话
,
引擎
|
现在我们创建多处理池,配置为使用所有可用的CPU内核减去一个。每个核心都会调用create_dataframe ()函数并创建一个包含4,000条记录的DataFrame,并且在对该函数的每次调用完成后,创建的所有DataFrame将被连接到一个DataFrame中。
|
1
2
3.
4
5
6
7
|
如果
__name__
==
“__main__”
:
num_cores
=
cpu_count
(
)
-
1
与
池
(
)
作为
池
:
数据
=
pd
。
concat
(
池
。
地图
(
create_dataframe
,
范围
(
num_cores
)
)
)
数据
。
to_sql
(
名字=“员工”
,
反对=引擎
,
if_exists
=
“添加”
,
指数=假
,
dtype=模式
)
与
引擎
。
连接
(
)
作为
康涅狄格州
:
康涅狄格州
。
执行
(
"ALTER TABLE employees添加id INT NOT NULL AUTO_INCREMENT主键优先;"
)
|
最后,我们将通过调用to_sql将DataFrame插入MySQL()方法。所有的数据将存储在一个名为员工。
通过调用conn.execute (),新列命名为id将添加到表中,设置为主键,并放在开头。
运行以下语句填充表:
|
1
|
python
sql
. py
|
使用多处理创建数据框
生成包含60,000条记录的DataFrame只需要几秒钟的时间,这就是实现多处理的原因。
Percona监控和管理的CPU利用率雷竞技下载官网raybet雷竞技竞猜在线官网
脚本完成后,您可以检查数据库中的数据。
|
1
2
|
使用
公司;
选择数(*)
从
雇员;
|
函数的作用是:返回数组中记录的个数员工表格
|
1
2
3.
4
5
6
|
+----------+
|
数
(*)
|
+----------+
|
60000
|
+----------+
1
行
在
集
(
0.22
证券交易委员会
)
|
这篇博文中显示的代码可以在我的GitHub帐户中找到数据生成器存储库。







很好的例子,还有一些不错的技巧可以使用。在这种情况下,如何配置执行池以并行处理以模拟并发操作和测试数据库隔离级别?