pysql lite transactions question

Stormbringer andreif at mail.dntis.ro
Sun Dec 21 13:46:50 EST 2003


Hi Gerhard,

I apologize for my barbaric code, I was under the impression that I
could use the transaction commands directly from sqlite. I wasn't
aware that cursors had rollback and commit functions. Now I understand
how all must be handled.

Thanks for the clarifications,
Andrei


Gerhard Häring <gh at ghaering.de> wrote in message news:<mailman.1.1072009735.684.python-list at python.org>...
> Stormbringer wrote:
> > Hi,
> > 
> > Could anyone shed some light on transactions using pysqlite when
> > autocommit is off ?
> 
> Sure.
> 
> > I am using Python 2.3 with latest pysqlite and after I do a
> >        m_connection = sqlite.connect(name, autocommit=0)
> > and
> >        m_cursor = self.m_connection.cursor()
> > 
> > and then looks like it starts a transaction automaticaly, because if I
> > issue a
> >        m_cursor.execute('BEGIN TRANSACTION')
> > it says that nested transactions are not permitted.
> > 
> > But : if I issue an 'END TRANSACTION' and then a 'BEGIN TRANSACTION'
> > and do the usual db operations and in the end I do a 'END TRANSACTION'
> > I get this :
> 
> If you want to mess with transactions yourself, use autocommit mode. But 
> in normal, transactional mode, please only use .commit() and .rollback() 
> on the connection object.
> 
> > Exception _sqlite.DatabaseError: 'cannot rollback - no transaction is
> > active' in <bound method Connection.__del__ of <sqlite.main.Connection
> > instance at 0x0086D288>> ignored
> 
> I myself would prefer an ElectrificationException instead. Maybe that 
> would reduce such perverted usage :->
> 
> > [...] My reasons of trying to use transactions is that it seems to make
> > sense in what I do, i.e. I try to populate a database and if I get an
> > error halfway I want to cancel the whole chain of operations. Plus I
> > noticed the speed is much greater if I put autocommit to off.
> > 
> > Any ideas ?
> 
> Yes.
> 
> DON'T MESS WITH TRANSACTIONS MANUALLY!!! Cough.
> 
> It's absolutely not needed in 99.99999999 % of all cases. Yet people 
> still think they're smarter than the designers of the DB-API and me ;-)
> 
> Here's a simple way to achieve what you want:
> 
> cx = sqlite.connect(...)
> cu = cx.cursor()
> 
> try:
>      # Do your INSERTs here
>      cx.commit()
> except DatabaseError:
>      cx.rollback()
> 
> Seeing this misuse of transactional commands in .execute() I'll change 
> PySQLite to throw ProgrammingError when they're used in non-autocommit mode.
> 
> -- Gerhard




More information about the Python-list mailing list