※この記事ではDBはAWSのAuroraを想定しています。
Auroraに多くのデータをまとめて登録したいとき、1レコードごとにINSERT文を書いて実行するのは少しイケてない思っていたので、
良い方法を探していたところ、 executemany というメソッドが用意されているのを知りました。
pep249 にも記載があるので、PyMySQL以外のライブラリでも用意されていると思います。
サンプルコード載せるに状況の説明です。
INSERTしたいデータは例えば次のようなものだとします。
print(df)
"""
date open high low close
0 2020-07-08 22481.61 22667.95 22438.65 22438.65
1 2020-07-09 22442.30 22679.08 22434.38 22529.29
2 2020-07-10 22534.97 22563.68 22285.07 22290.81
3 2020-07-13 22591.81 22784.74 22561.47 22784.74
4 2020-07-14 22631.87 22677.02 22538.78 22587.01
.. ... ... ... ... ...
195 2021-04-23 28939.12 29035.34 28770.62 29020.63
196 2021-04-26 29095.49 29241.28 28896.37 29126.23
197 2021-04-27 29174.53 29187.11 28990.19 28991.89
198 2021-04-28 28935.51 29139.70 28875.91 29053.97
199 2021-04-30 28996.66 29046.49 28760.27 28812.63
[200 rows x 5 columns]
"""
そして、INSERT先のテーブルは以下です。
(connection は既にRDSへの接続が完了しているものとします。)
with connection.cursor() as cursor:
cursor.execute("SHOW CREATE TABLE nikkei")
result = cursor.fetchone()
print(result["Create Table"])
"""
CREATE TABLE `nikkei` (
`date` date NOT NULL,
`open` double NOT NULL,
`high` double NOT NULL,
`low` double NOT NULL,
`close` double NOT NULL,
PRIMARY KEY (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
"""
通常であれば、この200あるレコード一つ一つについて、for文で回して、それぞれINSERT文を発行するところなのですが、
cursor.executemany を使うと次のように(表向きは)一発でINSERTできます。
(おそらく内部では1レコードずつINSERT文が発行されているのですが。)
insert_sql = """
INSERT INTO
nikkei (
date,
open,
high,
low,
close
)
VALUES
(
%s, %s, %s, %s, %s
)
"""
with connection.cursor() as cursor:
cursor.executemany(insert_sql, df.values.tolist())
connection.commit()