[sqlalchemy] Re: execute() and commit() and commit

2010-02-12 Thread Bob Farrell
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.



[sqlalchemy] Re: execute() and commit() and commit

2010-02-12 Thread Bob Farrell
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.