めもちょー

メモ帳代わりに使っています。

PythonのFakerモジュールを用いてDBにダミーデータを100万件挿入する

はじめに

こちらの記事ではUNIONCROSS 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)