背景:
对上线系统压测时,需要mock大量数据,满足压测过程中数据量的需求,于是乎想到了faker。 经过使用,个人结论放到最前面 (有不同观点欢迎评论):
-
faker适用于mock 无关联关系 的实体数据,如人、工作等等,不适合mock 有关联关系 的多个实体数据,这一点从faker的官方文档中就可以看出来
实例:
#! /usr/local/bin/Python3
#coding=utf-8
from faker import Faker
import mysql.connector
import random
"""
mysql 连接池
"""
def getConnect():
mysqlConfig = {
"user": "xxx",
"password": "xxx",
"port": 8306,
"host": "xxx",
"database": "test"
}
pool = mysql.connector.connect(pool_name = "mypool", pool_size = 3, **mysqlConfig)
connPool = mysql.connector.pooling.MySQLConnectionPool(pool_name = "mypool", pool_size = 3, **mysqlConfig)
conn = connPool.get_connection()
return conn
def closeConnect(curosr):
curosr.close()
"""
"INSERT INTO tenant(uid, bce_account_id, name, description) VALUES (%(uid)s, %(bce_account_id)s, %(name)s, %(description)s)"
"""
def getInsertSql(valueDict, tableName):
sql = "Insert into %s (" % tableName
value = "("
for key in valueDict:
sql = sql + key + ", "
value = value + "%(" + key +")s, "
sql = sql[0:len(sql) - 2] + ")"
value = value[0:len(value) - 2] + ")"
return sql + " values " + value
'''
生成student数据,Count表示生成的条数
'''
def fakeStudent(count, fake):
if count <= 0:
raise Exception("fakeStudent count is not positive")
conn = getConnect()
tableName = "student"
for _ in range(count):
s = Student(fake.uuid4()[0:10], fake.name(), random.randint(0,100), random.choice(["man","woman"]))
sdict = s.__dict__
insertSql = getInsertSql(sdict, tableName)
cur = conn.cursor()
cur.execute((insertSql), sdict)
conn.commit()
closeConnect(cur)
'''
Student类
'''
class Student:
def __init__(self, sid, sname, sage, ssex):
super().__init__()
self.sid = sid
self.sname = sname
self.sage = sage
self.ssex = ssex
if __name__ == "__main__":
fake = Faker("zh_CN")
fakeStudent(10, fake)