Как упомянуло @SergeBallesta в комментариях, это могло быть вызвано заблокированной таблицей.
Я изначально передавал postgresql объект соединения в функцию read_ sql. Это приводит к тому, что функция to_ sql ожидает вечно.
df = pd.read_sql(query, connection)
df_to_write.to_sql(TABLE, con=engine, schema=SCHEMA, if_exists='replace', index=True)
Когда я заменил соединение с SQLAlchemy Engine, оператор to_ sql начал работать, как и ожидалось, без блокировки таблицы.
df = pd.read_sql(engine, connection)
df_to_write.to_sql(TABLE, con=engine, schema=SCHEMA, if_exists='replace', index=True)