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