🐍

np.nanをNoneに変換しないとDBアクセス時にエラーになることがある

に公開

始めに

※ 自宅で再現しなかったので、そういう事象が発生したということをメモするだけの記事。

FastAPIでアップロードされたCSVをもとに登録する処理を作っていました。そして、特定の条件でエラーになることに気づきました。しかし、エラーが発生行を確認しているとINSERT や UPDATEではなく、SELECTしたタイミングでエラーになっていることがわかりました。

今回の記事では、回避した方法を残します。

環境

  • Python
  • SQLAlchemy
  • MySQL

※ 再現しなかったのでバージョン不明

実装

特定の条件で発生していたエラーはnp.nanのパラメータを検索で使用していた時に発生していました。

query = select(User).where(User.id.in_([np.nan]))
# この検索時に発生
actual = (await db.execute(query)).scalars().all()

そのため、最も簡単な方法としてはnp.nanNoneに変換することで簡単に回避できます。都度、np.nanのチェックを入れる方法もあるのですが、メモリに余裕がある場合はこちらで一気に置換してしまったほうがコードの可読性も上がるし楽だと思います。

import pandas as pd
import numpy as np

# Sample DataFrameを作成します.
df = pd.DataFrame({'Column1': [1, 2, np.nan],
                   'Column2': [3, np.nan, 6],
                   'Column3': [7, 8, 9]})

df.replace({np.nan: None}, inplace=True)

ソースコード

なし

終わりに

発生後でブログにしようと考えていたのですが、その後にライブラリアップデートやPython本体のバージョン等のアップデートをかけてしまったせいで発生条件を見失ってしまいました。

更新時に変換できないパターンならともかく、検索時に変換できずにエラーになってしまうパターンを面白いと思ったタイミングですぐにブログにしてしまうべきでしたね。内容自体は薄いですが、そういうこともあるという周知ができればいいかなと思ってます。

Discussion