[DB-SIG] autocommit support in pep-249
Chris Clark
Chris.Clark at ingres.com
Tue Sep 13 00:20:18 CEST 2011
Hi All,
I was discussing with someone today autocommit support and found an area
of pep-249 where I think we could improve the wording (and the spec):
http://www.python.org/dev/peps/pep-0249/
.....
.commit()
Commit any pending transaction to the database. Note that
if the database supports an auto-commit feature, this must
be initially off. An interface method may be provided to
turn it back on.
.....
It is the last sentence that I'm looking at:
> An interface method may be provided to turn it back on.
Comments:
* The "may" clearly marks this as an optional interface (and I'm
happy about that).
* It would be helpful to make clear what the interface method would
be so module authors can implement this consistently
* if autocommit can be turned on in a connection, there should have
a way to turn it off again
Here are some examples of the "interface method" implemented out in the
wild today
* It looks like mxodbc handles this as a setconnectoption() method
on the connection.
http://www.egenix.com/products/python/mxODBCConnect/doc/mxodbc/
* a number of other ODBC based drivers offer an option in the
connect() constructor (only)
* The mysql module <http://mysql-python.sourceforge.net/> implies it
has an method on the connection object for this conn.autocommit(),
but this does not appear to be available in the pep-249 compatible
API <http://mysql-python.sourceforge.net/MySQLdb-1.2.2/>!
Obviously there is plenty of scope for different implementations. I
think there is value in documenting a recommendation on what this
interface should look like.
I like the API approach mxodbc has taken (it matches ODBC very well) but
it doesn't feel Pythonic :-(
To get the ball rolling, here is an initial suggestion:
* needs to take a boolean flag as a parameter to enable and also disable
* needs to return the auto commit state so it can be queried
pep changes, marked between ** and **:
Connection Objects
Connection Objects should respond to the following methods:
......
.commit()
Commit any pending transaction to the database. Note that
if the database supports an auto-commit feature, this must
be initially off. **See the option autocommit() method to change
autocommit behavior.**
Database modules that do not support transactions should
implement this method with void functionality.
.....
**
Connection Objects may optional implement and respond to the
following methods:
autocommit(on=None)
returns True when autocommit is on, and False when autocommit is off.
If the keyword parameter "on" is set to True, the connection will
commit any open transactions (as if connection.commit() was issued) and
all subsequent transactions will auto commit, the method returns True if
successfully in autocommit mode.
If the keyword parameter "on" is set to False, the connection
will commit any open transactions (as if connection.commit() was issued)
and all subsequent transactions will no longer auto commit, the method
returns False if successfully out of autocommit mode..
**
The reason for the immediate commit is to try and avoid DBMS specific
behaviors (read error conditions) with different vendors when an auto
commit is requested with open transactions.
Comments?
Chris
More information about the DB-SIG
mailing list