使用Faker生成虚拟数据
创建虚拟数据是编写Web程序时的常见需求。在简单的场景下,我们可以手动创建一些虚拟数据,但更方便的选择是使用第三方库实现。流行的python虚拟数据生成工具有Mimesis和Faker,后者同时支持python2和python3,而且文档中包含丰富的示例,所以这里选用Faker。首先用pipenv安装(使用—dev选项声明为开发依赖):pipenv install faker --dev
Faker内置了20多类虚拟数据,包括姓名、地址、网络账号、信用卡、时间、职位、公司名称、Python数据等。要生成虚拟数据,首先要实例化Faker类,创建一个fake对象作为虚拟数据生成器:
>>> from faker import Faker >>> fake = Faker()
这个fake对象可以使用分别对应所有虚拟数据类别的方法来获取虚拟数据,比如name、address、text等,每次调用都会获得不同的随机结果,一些基本的实例如下所示:
>>> from faker import Faker >>> fake = Faker() >>> fake.name() u'Shane Schmidt' >>> fake.address() u'5327 Mcintosh Knolls Scottshire, SC 42652' >>> fake.text() u'Before least case never process financial upon instead.' >>> fake.text() u'Including wait dog she. Idea husband heart really executive safe option. Step save point quality citizen may. Air full name sea. Very matter camera public most.'
默认的虚拟数据语言为英文,如果你想获取其他语言的虚拟数据,可以在实例化Faker类时传入区域字符作为第一个参数(locale)来指定:
fake = Faker(‘zh_CN’)
在Faker中,简体中文和繁体中文对应的区域字符串分别为zn_CN和zh_TW.
下面示例中,用Faker实现了一个生成虚拟留言数据的命令函数fake。
messageBoard/messageBoard/commands.py:
@app.cli.command() @click.option('--count', default=20, help='Quantity of messages, default is 20.') def forge(count): """Generate fake messages.""" from faker import Faker db.drop_all() db.create_all() fake = Faker() click.echo('Working...') for i in range(count): message = Message( name = fake.name(), body = fake.sentence(), timestamp = fake.date_time_this_year() ) db.session.add(message) db.session.commit() click.echo('Created %d fake messages.' % count)
使用for循环操作数据库时,为了提高效率,我们只需要在for循环结束后调用一次db.session.commit()方法提交数据库会话。
在这个命令函数前,我们使用click提供的option装饰器为命令添加数量选项—count,使用default关键字将默认值设为20。
为了方便测试,生成虚拟数据前会删除重建数据库表。我们分别调用fake对象的name()、sentence()、date_time_this_year()方法生成虚拟的姓名、留言和时间戳。现在使用下面的命令生成虚拟数据:
(messageBoard-0K8c_mmc) D:flaskmessageBoard>flask forge
Working...
Created 20 fake messages.
选项—count用来指定生成的留言数量,下面生成了50条虚拟留言:
(messageBoard-0K8c_mmc) D:flaskmessageBoard>flask forge --count=50
Working...
Created 50 fake messages.
再次访问页面,首页会显示一个很长的留言列表,根据创建的随机日期排序,最先发表的排在上面