Opened 14 years ago

Closed 14 years ago

Last modified 12 years ago

#216 closed defect (fixed)

sqlite3 broken post rev 329

Reported by: gch@… Owned by: Adrian Holovaty
Component: Metasystem Version:
Severity: normal Keywords:
Cc: rmunn@… Triage Stage: Ready for checkin
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Adrian Holovaty)

Changes to function_get_list in in [329] seem to have broken support for sqlite3. Loading the barebones admin site in [328] works fine. If I do the same with [329], I get the following stack trace posted here:

Change History (11)

comment:1 Changed 14 years ago by Adrian Holovaty

Description: modified (diff)

comment:2 Changed 14 years ago by Adrian Holovaty

Jeez, is the Python SQLite module so broken that it doesn't know how to handle cursor.fetchmany()?

I don't have immediate access to SQLite. Could you try running polls.get_iterator() using SQLite, in the version that *does* work for you ([328])? If my hunch is correct, that won't work, either.

comment:3 Changed 14 years ago by rmunn@…

The cursor.fetchmany() function in pysqlite2 seems to work fine for me:

Python 2.4.1 (#2, Jul 21 2005, 15:58:35) 
[GCC 4.0.2 20050720 (prerelease) (Debian 4.0.1-2ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pysqlite2 import dbapi2 as sqlite
>>> conn = sqlite.connect('/home/rmunn/projects/learndjango/django-data.db')
>>> curs = conn.cursor()
>>> curs.execute('select * from foo')
>>> curs.fetchmany(2)
[(1, u'one'), (2, u'two')]
>>> curs.fetchmany(2)
[(3, u'three'), (4, u'four')]
>>> curs.fetchmany(2)

Running the polls application from the tutorial also works for me, both calling polls.get_list() and polls.get_iterator(), all on sqlite3. I don't think cursor.fetchmany() is the culprit here.

In case it makes a difference, I'm running sqlite3 version 3.2.1 and revision 332 of Django.

comment:4 Changed 14 years ago by gch@…

I was able to do the same python code as rmunn posted. If I have a 4-item table, then the first call to "fetchmany(2)" returns 2 items, as does the second. The third call returns the empty list. If you make a 4th call, however, I get the same error, which suggests that our problem may be from erroneous bounds checking.

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
pysqlite2.dbapi2.ProgrammingError: no compiled statement - you need to execute() before you can fetch data

Adrian, I am able to run polls.get_iterator() just fine on both [328] and [329] (both return a pointer to the iterator) but not polls.get_list(), which only works with [328].

>>> polls.get_iterator()
<generator object at 0xb7becb4c>

comment:5 Changed 14 years ago by Adrian Holovaty

That's interesting...

gch, which versions of SQLite 3 and the Python bindings are you using?

comment:6 Changed 14 years ago by gch


comment:7 Changed 14 years ago by rmunn@…

I think the bug is in pysqlite 2.0.2 - see for a list of changes, one of which fixes a bug which sound suspiciously like this one.

I believe the answer is to upgrade to pysqlite 2.0.3.

comment:8 Changed 14 years ago by rmunn@…

Cc: rmunn@… added

comment:9 Changed 14 years ago by rmunn@…

Oh, and when I ran the code above at the interactive prompt, I actually called cursor.fetchmany(2) a fourth time, which I left out of the cut&paste because I hadn't thought it was relevant. Silly me... :-) It succeeded, returning an empty list just like the third call had done.

I'm 99.8% confident now that this bug will go away if you update to pysqlite 2.0.3.

comment:10 Changed 14 years ago by gch

Well, that 99.8% won out! I tried with pysqlite 2.0.3, and the problem is gone. Thanks a lot guys! I'll let you all mark this as resolved.

comment:11 Changed 14 years ago by Adrian Holovaty

Resolution: fixed
Status: newclosed

Great. I'm glad this got worked out. I've updated the docs in [335] to mention pysqlite 2.0.3 explicitly.

Note: See TracTickets for help on using tickets.
Back to Top