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"])