Please note: This wiki is currently running in test mode after an attack on January 5 2013. All passwords were reset, so you will have to use the password recovery function to get a new password. To edit wiki pages, please log in first. See the wiki attack description page for more details. If you find problems, please report them to the pydotorg-www mailing list.

What sucks about the DbApi

It totally misuses the cursor concept.

A cursor is a set of database rows you iterate over. It can be clientside or server-side.

In the DbApi, you first create a cursor object, then execute a statement on it, then fetch the results.

The normal way of using cursors with the DB-API is to reuse the cursor objects and fire new statements with them, and fetch new results.

This is totally misguided in my opinion.

A much better API should look similar to:

cx = dbapimodule.connect()
cx.execute("insert into tablename(val) values (?)", ('foo',))

for row in cx.executeReader("select val from tablename"):
    print row

row = cx.executeRow("select max(val) from tablename")

etc.

executing statements logically belongs in the connection object, not in the cursor object.

(Alas, then you could only loop over a single set of results at a time. I think the current cursor concept makes sense. -skip)

Enough ranting for now, more will come some day. Maybe somebody can clean this up and add a few thoughts :)

---

The "execute" method, or whatever it's called, could then return an iterator. In that case there is no problem with loop over different sets of results. The current cursor concept does make *some* sense, but it's awkward and pre-iterators.

DbApiSucks (last edited 2008-11-15 13:59:41 by localhost)