はじめに
こちらの記事ではUNION
とCROSS JOIN
を用いてダミーデータをSQL内で生成する方法を書きました。
memo.geso.site
今回はPythonのFakerというモジュールを用いて100万件のダミーデータを用意する方法を書きます。
thegrayarea.tech
Fakerについて
下記のダミーデータが作製できるようです。
- 個人情報
- 名前
- 住所
- 電話番号
- メールアドレス
- 企業情報
- 会社名
- 役職
- 業種
- 数値情報
- 乱数
- UUID
- hash値
- 時間情報
- 日付
- 時間
- タイムゾーン
- 車両情報
- 車種
- 色
- ナンバープレート
- インターネット関連情報
- ウェブサイト
- IPアドレス
- ドメイン名
ダミーデータの挿入
tableの準備
前回と同じように下記のコマンドからコンテナを立ち上げます。
$ docker run --platform linux/x86_64 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest $ mysql -uroot -pmy-secret-pw -h127.0.0.1 -P3307
コンテナに入ったら、databaseを作製します。
$ CREATE DATABASE sample; $ USE sample;
挿入スクリプトを書く
from faker import Faker import mysql.connector from tqdm import tqdm LIMIT = 1000000 fake = Faker() # MySQLと接続 cnx = mysql.connector.connect( user='root', password='my-secret-pw', host='127.0.0.1', port='3307', database='sample' ) # データの挿入 cursor = cnx.cursor() for i in tqdm(range(LIMIT)): name = fake.name() email = fake.email() email_verified_at = fake.date_time_between(end_date='now') remember_token = fake.uuid4() created_at = fake.date_time_between(end_date='now') updated_at = fake.date_time_between(end_date='now') add_data = ("INSERT INTO dummy_data " "(name, email, email_verified_at, remember_token, created_at, updated_at) " "VALUES (%s, %s, %s, %s, %s, %s)") data = (name, email, email_verified_at, remember_token, created_at, updated_at) cursor.execute(add_data, data) cnx.commit() # MySQLから切断 cursor.close() cnx.close()
data_time_between()
のパラメタは下記の通りになります。
faker.readthedocs.io
実行すると6分2秒かかりました。
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000000/1000000 [06:02<00:00, 2761.30it/s]
データの確認
MySQLから確認すると見事100万件のデータが格納されていることが分かります。
実験後に気づきましたがcreated_at < updated_at
の制約をつけてダミーを生成したほうが自然だったかもしれません。
mysql> select COUNT(1) from dummy_data; +----------+ | COUNT(1) | +----------+ | 1000000 | +----------+ 1 row in set (0.05 sec) mysql> select * from dummy_data limit 10; +-------+------------------+-------------------------------+---------------------+--------------------------------------+---------------------+---------------------+ | id | name | email | email_verified_at | remember_token | created_at | updated_at | +-------+------------------+-------------------------------+---------------------+--------------------------------------+---------------------+---------------------+ | 38576 | Colton Carpenter | mary13@example.com | 2021-04-27 08:50:45 | fb9d2923-8eb7-42f7-9e12-49a0ecf6eb41 | 2022-06-07 08:35:24 | 2021-02-11 18:07:20 | | 38577 | Nicole Maxwell | william66@example.org | 2021-02-17 22:54:46 | de85473e-46df-4d98-8865-88b18ba4e7ff | 2020-09-09 13:27:04 | 2004-02-15 13:49:16 | | 38578 | Mary Whitaker | gjohnson@example.com | 2009-11-13 13:03:36 | 243f4e52-1f72-4b94-9926-4836177314f8 | 2006-05-29 15:11:06 | 1999-06-16 00:52:07 | | 38579 | Rebecca Miller | bishopaustin@example.net | 2022-04-14 13:45:53 | d395f880-caac-487a-be49-6301879fb2d1 | 2002-12-15 07:19:35 | 2013-05-22 08:42:40 | | 38580 | Christina Cain | andrew62@example.net | 2021-05-27 21:23:46 | 784ec14f-5d3a-462a-8143-fc522047ba93 | 2010-03-14 10:12:56 | 2000-03-21 21:13:09 | | 38581 | Justin Liu | greenfrancisco@example.org | 2006-09-12 00:33:48 | 86a3e727-9def-4ea4-89d5-b5f5d9f6f0fb | 2004-03-24 03:16:55 | 1999-01-05 18:56:16 | | 38582 | Keith Espinoza | nicholashudson@example.net | 2013-04-21 06:53:08 | 357eaef6-101a-4d55-8939-91020b9574aa | 1995-06-28 19:41:33 | 2013-08-30 21:57:55 | | 38583 | Jose Evans | aaron72@example.com | 2020-06-05 15:19:55 | 787ec97e-bbf5-4b6a-afdc-11708d542d62 | 1998-12-18 19:20:28 | 1995-07-15 19:10:52 | | 38584 | James Thomas | johnavery@example.com | 2008-01-25 09:53:33 | b55d42ba-1682-4df0-a586-17db8607d4ca | 2020-04-03 19:41:07 | 2011-07-23 02:53:36 | | 38585 | Jonathan Hill | jenniferhernandez@example.net | 1994-04-23 09:50:25 | 2a8a0c2b-4613-481d-8d06-c5cded42d0ff | 2010-12-01 10:02:31 | 1994-05-09 15:35:27 | +-------+------------------+-------------------------------+---------------------+--------------------------------------+---------------------+---------------------+ 10 rows in set (0.00 sec)