Python faker mock实体数据

345 阅读1分钟

背景:

对上线系统压测时,需要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)