使用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\nScottshire, 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.\nAir 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:\flask\messageBoard>flask forge
Working...
Created 20 fake messages.
選項—count用來指定生成的留言數量,下面生成了50條虛擬留言:
(messageBoard-0K8c_mmc) D:\flask\messageBoard>flask forge --count=50
Working...
Created 50 fake messages.
再次訪問頁面,首頁會顯示一個很長的留言列表,根據創建的隨機日期排序,最先發表的排在上面

