PyMySQL icon indicating copy to clipboard operation
PyMySQL copied to clipboard

TypeError: 'DictCursor' object is not an iterator

Open sanchezg opened this issue 4 years ago • 4 comments

Describe the bug

Trying to iterate over a set of results:

main_query = cursor.execute(QUERY, args=args)
result = next(main_query)

I get a: TypeError: 'DictCursor' object is not an iterator

I think the problem is that BaseCursor implements __iter__ method and not the __next__ method, as the Python reference states: https://docs.python.org/3/glossary.html#term-iterator

I made a workaround:

class DataBaseCursor(pymysql.cursors.DictCursor):
    def __iter__(self):
        return self

    def __next__(self):
        return next(iter(self.fetchone, None))

And it works as expected.

I can upload a PR with that for review, what do you think?

sanchezg avatar Jul 27 '21 00:07 sanchezg

Currently, Cursor is an iterable, not an iterator. So missing __next__ is not a bug. You can iterate over the cursor with for statement or iter(cursor).

But DB-API 2.0 says .next() optional method. It is iterator protocol in Python 2. So having __next__ makes sense to me. Go ahead.

methane avatar Jul 27 '21 00:07 methane

Thanks for your response! And yes, you're right, my bad. In this case Cursor is an iterable. However I can work with having also __next__ implemented.

sanchezg avatar Jul 27 '21 15:07 sanchezg

Please create a PR.

methane avatar Aug 03 '21 05:08 methane

@methane I couldn't find a contribution guidelines, I just upload a PR but please do not hesitate in point me if I need to follow a particular template or complete any additional docs ~~or tests~~.

EDIT: working on tests right now.

sanchezg avatar Aug 03 '21 15:08 sanchezg