目录
前言
数据在项目开发过程是一个非常重要的环节,如开发系统时很多时候我们在后端建立了数据库但几乎没什么数据,这对于系统测试来说非常致命,尽管主流的数据库连接工具Navicat已经具备生成随机数据的能力,但是生成的数据基本上都是数字和字符串而已,完全没法模拟真实的数据场景。网上也有在线生成数据的工具,但也只是能简单的生成姓名,地址这些而已,且生成的数据即使能保存成文件格式,能不能存入数据库又是未解之谜。所以本期写着篇博客与大家分享一下如何使用Faker去生成一些我们想要的模拟数据
一、Faker是什么?
Faker是一个 Python 包,可以为你生成假数据。无论您是需要引导您的数据库、创建美观的 XML 文档、填写您的持久性以对其进行压力测试,还是匿名化从生产服务中获取的数据。这是来自于官方的解释,我的理解就是一个可以按照个人要求生成模拟数据的包,如果你对它有更深层次的认识,你完成可以用它生成一个真实的数据集
二、使用步骤
1. Faker引入
官方推荐使用pip安装Faker, 如果下载很慢,请加镜像源
pip install Faker
新建python文件,导入faker包,创建一个faker对象,设置locale='zh_CN'后,大部分属性就能生成中文的数据
from faker import Faker
fake = Faker(locale='zh_CN')
2. Faker的使用方法
完成Faker的引用后,我们可以使用faker一些常用的内置方法,如简单生成用户名,地址,城市等, 这里我随机生成了20条订单表的数据。
def generate_order_data():
datas = [
[
fake.ean(prefixes=('23',), length=8),
fake.unique.random_int(min=1000, max=5000),
fake.name(),
fake.phone_number(),
fake.ssn(),
fake.date(),
fake.date(),
fake.random_digit_not_null(),
fake.numerify(),
]
for x in range(10)
]
return datas
if __name__ == '__main__':
order_datas = generate_order_data()
print(order_datas)
想必大家一开始都不知道这些方法是怎么使用以及如何设置方法里面的参数, 现在我和大家分享一下faker里面都内置了哪些方法以及如何去设置参数生成合乎要求的数据
faker为中国的开发者提供了中文数据,只需要设置locale='zh_CN'即可
官方中几乎对所有的方法都做了详细的介绍和演示,你可以在官方网站找到绝大多你想要生成模拟数据的方法
设想如果你表中的数据值是在某个范围内,那有该如何使用faker生成,是的,faker开发团队为你预留了可以自定义生成数据的方法,你需要在继续引入一些包,比如DynamicProvider
from faker import Faker
from faker.providers import DynamicProvider
fake = Faker(locale='zh_CN')
roomType = DynamicProvider(
provider_name="room_type",
elements=["豪华套房", "商务套房", "总统套房", "时尚主题房", "豪华观景房", "烂漫都市情侣房", "梦回大唐书阁"]
)
paymentStatus = DynamicProvider(
provider_name="payment",
elements=["已支付", "待支付"]
)
orderStatus = DynamicProvider(
provider_name="order_status",
elements=["已预约", "已入住", "已退房"]
)
创建DynamicProvider对象后,使用faker.add_provider添加一下对象,然后你就能根据对象中设置的provider_name,使用方法如下
def generate_order_data():
fake.add_provider(paymentStatus)
fake.add_provider(roomType)
fake.add_provider(orderStatus)
datas = [
[
fake.ean(prefixes=('23',), length=8),
fake.unique.random_int(min=1000, max=5000),
fake.room_type(),
fake.name(),
fake.phone_number(),
fake.ssn(),
fake.date(),
fake.date(),
fake.random_digit_not_null(),
fake.numerify(),
fake.payment(),
fake.order_status()
]
for x in range(10)
]
return datas
if __name__ == '__main__':
order_datas = generate_order_data()
print(order_datas)
3. 将生成的模拟数据存储到MySQL
如何将生成的模拟数据存储到数据库呢,这儿我使用的pymysql, 首先在代码文件中导入pymysql, 设置连接数据库的url,用户名,密码等信息
import pymysql
def mysql_transmit_data(datas):
db = pymysql.connect(
host="127.0.0.1",
port=3306,
user='root',
password="645123ab",
db="hotel_management_system",
charset="utf8"
)
接下来获取操作游标,编写sql,调用函数时传入已经生成好的数据,向数据库中写入数据时,一定要确保insert语句正确,否则将会报错,完整代码如下
from faker import Faker
from faker.providers import DynamicProvider
import pymysql
fake = Faker(locale='zh_CN')
roomType = DynamicProvider(
provider_name="room_type",
elements=["豪华套房", "商务套房", "总统套房", "时尚主题房", "豪华观景房", "烂漫都市情侣房", "梦回大唐书阁"]
)
paymentStatus = DynamicProvider(
provider_name="payment",
elements=["已支付", "待支付"]
)
orderStatus = DynamicProvider(
provider_name="order_status",
elements=["已预约", "已入住", "已退房"]
)
def generate_order_data():
fake.add_provider(paymentStatus)
fake.add_provider(roomType)
fake.add_provider(orderStatus)
datas = [
[
fake.ean(prefixes=('23',), length=8),
fake.unique.random_int(min=1000, max=5000),
fake.room_type(),
fake.name(),
fake.phone_number(),
fake.ssn(),
fake.date(),
fake.date(),
fake.random_digit_not_null(),
fake.numerify(),
fake.payment(),
fake.order_status()
]
for x in range(200)
]
return datas
def mysql_transmit_data(datas):
db = pymysql.connect(
host="127.0.0.1",
port=3306,
user='root',
password="645123ab",
db="hotel_management_system",
charset="utf8"
)
cursor = db.cursor()
for data in datas:
sql = "insert into orders (order_id, room_number, room_title, customer_name, telephone, identification, check_in, check_out, stay_days, total_price, payment, status, create_time)" \
"value ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%s', '%s')" % (data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], int(data[8]), int(data[9]), data[10], data[11], data[6])
cursor.execute(sql)
db.commit()
db.close()
if __name__ == '__main__':
order_datas = generate_order_data()
mysql_transmit_data(order_datas)
总结
其实,模拟数据的工具还有其它的,比如国外的generatedata,Online data generator,虽然生成的数据类型也比较多,但都不能生成中文数据,而且也很难进行存储,国内开发的模拟数据生成器,那就是一个小白,所以未来希望能有技术大佬真正开发出一套接近与现实世界数据的模拟生成工具,这将大大为众多程序猿带来极致的开发效率。
不足之处,请多指教!!!