From b6d32d96616761af575f69ed7ff02dde0def2a20 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler <61934744+phofl@users.noreply.github.com> Date: Fri, 24 Mar 2023 17:55:14 -0400 Subject: [PATCH] Backport PR #52180: BUG: to_sql raises when arrow dtype has missing values --- pandas/core/arrays/arrow/array.py | 2 +- pandas/tests/io/test_sql.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 390eb33d6eefe..81d8183a79bc1 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -2077,7 +2077,7 @@ def _dt_round( def _dt_to_pydatetime(self): data = self._data.to_pylist() if self._dtype.pyarrow_dtype.unit == "ns": - data = [ts.to_pydatetime(warn=False) for ts in data] + data = [None if ts is None else ts.to_pydatetime(warn=False) for ts in data] return np.array(data, dtype=object) def _dt_tz_localize( diff --git a/pandas/tests/io/test_sql.py b/pandas/tests/io/test_sql.py index 40cd011a1dd62..2504794384038 100644 --- a/pandas/tests/io/test_sql.py +++ b/pandas/tests/io/test_sql.py @@ -570,6 +570,22 @@ def test_dataframe_to_sql_arrow_dtypes(conn, request): df.to_sql("test_arrow", conn, if_exists="replace", index=False) +@pytest.mark.db +@pytest.mark.parametrize("conn", all_connectable) +def test_dataframe_to_sql_arrow_dtypes_missing(conn, request, nulls_fixture): + # GH 52046 + pytest.importorskip("pyarrow") + df = DataFrame( + { + "datetime": pd.array( + [datetime(2023, 1, 1), nulls_fixture], dtype="timestamp[ns][pyarrow]" + ), + } + ) + conn = request.getfixturevalue(conn) + df.to_sql("test_arrow", conn, if_exists="replace", index=False) + + @pytest.mark.db @pytest.mark.parametrize("conn", all_connectable) @pytest.mark.parametrize("method", [None, "multi"])