I tried this against Oracle and it works without a hitch, so it looks
like it's a problem with sqlite - we've got some ideas on how to fix
it so we'll carry on looking. So this thread can be ignored now, as
it's not a sqlalchemy issue (unless sqlalchemy planned to special case
"commit" as text for sqlite).

Thanks,

On Feb 12, 12:33 pm, Bob Farrell <robertanthonyfarr...@googlemail.com>
wrote:
> Sorry, I forgot to mention that if I run my "select * from test;"
> *after* I get the error for test3, it shows that insert did in fact
> get committed to the database:
>
> {<. b...@mote: ~/dev/sasqlconsole .]
> £ sqlite3 test.sqlite "select * from test"
> 7|8|9
>
> So it seems that the "commit" is getting sent to the database and it's
> processing correctly, but SQLAlchemy is stepping in somewhere on the
> way back before the execute() returns and causing some mischief.
>
> On Feb 12, 12:19 pm, Bob Farrell <robertanthonyfarr...@googlemail.com>
> wrote:
>
> > Hi there,
>
> > I'm having a bit of trouble with session.execute() and session.commit()
>
> > Here's a simple example that demonstrates what I'm trying to do:
>
> > import os
> > import sys
>
> > import sqlalchemy.orm as orm
> > import sqlalchemy as sa
>
> > Session = orm.sessionmaker()
> > session = None
>
> > def setup():
> >     global session
>
> >     Session.configure(bind=sa.create_engine('sqlite:///test.sqlite'))
>
> >     session = Session(autocommit=False)
>
> >     try:
> >         os.unlink("test.sqlite")
> >     except OSError:
> >         pass
> >     session.execute("create table test (a, b, c)")
> >     session.commit()
>
> > def test1():
> >     session.execute("insert into test values (1, 2, 3)")
> >     session.commit()
>
> > def test2():
> >     session.execute("insert into test values (4, 5, 6)")
>
> > def test3():
> >     session.execute("insert into test values (7, 8, 9)")
> >     session.execute("commit")
>
> > if __name__ == "__main__":
> >     dispatch = {'test1': test1,
> >                 'test2': test2,
> >                 'test3': test3}
> >     if len(sys.argv) > 1 and sys.argv[1] in dispatch:
> >         setup()
> >         dispatch[sys.argv[1]]()
>
> > And here's the output from running each test:
>
> > {<. b...@mote: ~/dev/sasqlconsole .]
> > python test.py test1 && sqlite3 test.sqlite "select * from test;"
> > 1|2|3
> > {<. b...@mote: ~/dev/sasqlconsole .]
> > python test.py test2 && sqlite3 test.sqlite "select * from test;"
> > {<. b...@mote: ~/dev/sasqlconsole .]
> > python test.py test3 && sqlite3 test.sqlite "select * from test;"
> > Traceback (most recent call last):
> >   File "test.py", line 41, in <module>
> >     dispatch[sys.argv[1]]()
> >   File "test.py", line 33, in test3
> >     session.execute("commit")
> >   File 
> > "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/orm/session.py",
> >  line 753, in execute
> >     clause, params or {})
> >   File 
> > "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/engine/base.py",
> >  line 824, in execute
> >     return Connection.executors[c](self, object, multiparams, params)
> >   File 
> > "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/engine/base.py",
> >  line 874, in _execute_clauseelement
> >     return self.__execute_context(context)
> >   File 
> > "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/engine/base.py",
> >  line 896, in __execute_context
> >     self._cursor_execute(context.cursor, context.statement, 
> > context.parameters[0], context=context)
> >   File 
> > "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/engine/base.py",
> >  line 950, in _cursor_execute
> >     self._handle_dbapi_exception(e, statement, parameters, cursor, context)
> >   File 
> > "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.8-py2.5.egg/sqlalchemy/engine/base.py",
> >  line 931, in _handle_dbapi_exception
> >     raise exc.DBAPIError.instance(statement, parameters, e, 
> > connection_invalidated=is_disconnect)
> > sqlalchemy.exc.OperationalError: (OperationalError) cannot commit - no 
> > transaction is active u'commit' []
>
> > Tests 1 & 2 behave as I'd expect, but it's when I try to pass in a "commit" 
> > as
> > a string to execute() that I see explosions.
>
> > This is for a SQL repl I wrote some time ago and I decided to add 
> > transactions
> > to it so I need a sane way to deal with "commit" being typed. I'd like to 
> > make
> > this behaviour optional so that it can mimic other sql repls such as 
> > sqlplus.
>
> > Any suggestions on the best way to go about doing this are welcome.
>
> > Thanks,
> > --
> > Bob Farrell

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to