-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Apr 12, 2012, at 1:55 PM, Manlio Perillo wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi.
>
> I looked at SQLAlchemy source code to see examples about `with`
> statement support and found something that look suspicious to me.
>
> class Engine:
> ....
>
> def begin(self, close_with_result=False)
> conn = self.contextual_connect(
> close_with_result=close_with_result)
> trans = conn.begin()
> return Engine._trans_ctx(conn, trans, close_with_result)
>
> What happens in case conn.begin() fails?
the call to begin() overall would raise an exception.
>
> I was assuming that conn.begin always executed a BEGIN SQL command, but
> this is not the case.
> However some dialects (like informix and MySQL oursql) *do* execute SQL
> commands, and these can fail.
and I guess the concern is the Connection is left to the garbage collector to
be closed. In rfc4e7ddc0777 I changed it to:
conn = self.contextual_connect(close_with_result=close_with_result)
try:
trans = conn.begin()
except:
conn.close()
raise
return Engine._trans_ctx(conn, trans, close_with_result)
note that in other cases like engine.execute(), the "close_with_result" flag is
unconditionally true meaning an exception there closes out the connection in
line 1830 in _handle_dbapi_exception().
> I have another question, about coding style.
> Current SQLAlchemy code create the connection and transaction objects in
> the Engine.begin method, and then return an instance of
> Engine._trans_ctx class.
>
> What about, instead, creating the connection and transaction objects
> inside the __enter__ method of the Engine._trans_ctx class?
>
> Doing this way, one can prevent incorrect usage of the context manager;
> that is doing so:
>
> ctx = db.begin()
>
> should not create a connection that will never be explicitly closed.
oh that's a nice idea, if you create a pull request from
https://bitbucket.org/sqlalchemy/sqlalchemy I can pull that in, thanks !
you'll need to adjust my new test
test.engine.test_execute:ConvenienceExecuteTest.test_transaction_engine_ctx_begin_fails
to use testing.run_as_contextmanager in order to hit the exception in that
case.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (Darwin)
Comment: GPGTools - http://gpgtools.org
iQEcBAEBAgAGBQJPhyLYAAoJEDMCOcHE2v7hC8gIANHeUt3534OSHQDzvxLDU4M8
lelma2zafTADVSbQm/WSE79HjTQSBgSVopWKL13lbvU44B/7yYbzVBDu4ZNb8DsX
0aM6I6W36km5EV5lPjOqeBZOAaWNquqXA8g0ic5+79K7LplUpbDfKI/Q8eSgWRjm
ZZW8pzo/cFpEN33+0U7zOh6yariFE+W5dtINVmjf3UMJbGJ1ieEyff4wflbQI+UI
q5pw4Pqby+YqBBfqC6EfAnCHKkBV61PXSbMVBQfQRVqflFxY440HYDm0zZ6WJytV
wZlISaakTKH1mPzTUT3R9flx2NsN7aU4/NkSMSkuqS3VaJhx33oj0DJNHm4ZKFE=
=1tow
-----END PGP SIGNATURE-----
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.