Bob Farrell wrote:
> 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).

the mechanics of "commit" and such are highly DBAPI specific.  You should
ask on the pysqlite list about this.




>
> 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.
>
>

-- 
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