From db640e4d599e69baea2818695880c216c0e57c09 Mon Sep 17 00:00:00 2001 From: Gonzalo Sanchez Date: Tue, 3 Aug 2021 12:20:29 -0300 Subject: [PATCH 1/4] Make Cursor an iterator --- pymysql/cursors.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pymysql/cursors.py b/pymysql/cursors.py index 2b5ccca90..6afba4978 100644 --- a/pymysql/cursors.py +++ b/pymysql/cursors.py @@ -346,7 +346,10 @@ def _do_get_result(self): self._rows = result.rows def __iter__(self): - return iter(self.fetchone, None) + return self + + def __next__(self): + return next(iter(self.fetchone, None)) Warning = err.Warning Error = err.Error From 0a1634765058c602593154aa75597609e8a7fb36 Mon Sep 17 00:00:00 2001 From: Gonzalo Sanchez Date: Thu, 12 Aug 2021 16:03:56 -0300 Subject: [PATCH 2/4] Update pymysql/cursors.py Co-authored-by: Inada Naoki --- pymysql/cursors.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pymysql/cursors.py b/pymysql/cursors.py index 6afba4978..1032c8252 100644 --- a/pymysql/cursors.py +++ b/pymysql/cursors.py @@ -349,7 +349,10 @@ def __iter__(self): return self def __next__(self): - return next(iter(self.fetchone, None)) + row = self.fetchone() + if row is None: + raise StopIteration + return row Warning = err.Warning Error = err.Error From b833e04ffa4e073dea8b47505d09bc4c22641fb8 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 24 May 2023 00:18:23 +0900 Subject: [PATCH 3/4] Fix SSCursor --- pymysql/cursors.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pymysql/cursors.py b/pymysql/cursors.py index a11ab122d..d8a93c781 100644 --- a/pymysql/cursors.py +++ b/pymysql/cursors.py @@ -465,9 +465,6 @@ def fetchall_unbuffered(self): """ return iter(self.fetchone, None) - def __iter__(self): - return self.fetchall_unbuffered() - def fetchmany(self, size=None): """Fetch many.""" self._check_executed() From f84456261ff7fa230cfc4cfc406adb277f130ccb Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 24 May 2023 00:23:24 +0900 Subject: [PATCH 4/4] Add test for iterator interface --- pymysql/tests/test_cursor.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pymysql/tests/test_cursor.py b/pymysql/tests/test_cursor.py index 66d968dfe..16d297f68 100644 --- a/pymysql/tests/test_cursor.py +++ b/pymysql/tests/test_cursor.py @@ -25,6 +25,14 @@ def setUp(self): self.test_connection = pymysql.connect(**self.databases[0]) self.addCleanup(self.test_connection.close) + def test_cursor_is_iterator(self): + """Test that the cursor is an iterator""" + conn = self.test_connection + cursor = conn.cursor() + cursor.execute("select * from test") + self.assertEqual(cursor.__iter__(), cursor) + self.assertEqual(cursor.__next__(), ("row1",)) + def test_cleanup_rows_unbuffered(self): conn = self.test_connection cursor = conn.cursor(pymysql.cursors.SSCursor)