On Oct 13, 2013, at 7:45 AM, Martin Stettner <[email protected]> wrote:

> I'm using SqlAlchemy core to access my database. I'm just wondering if 
> there's a specific reason why the ResultProxy class doesn't implement the 
> __enter__ and __exit__ methods for automatically closing the results of a 
> query using Python's with statement. This would make the following code 
> possible
> 
> stmt = select(mytable)
> with engine.execute(stmt) as result:
> # do something with result...
> pass
> #result (and possibly connection) gets automatically closed
> 
> For now, I'm helping myself with a AutoClose class:
> 
> class AutoClose:
> def __init__(self, close_object):
> self.close_object = close_object
> 
> def __enter__(self):
> return self.close_object
> 
> def __exit__(self, type, value, traceback):
> self.close_object.close()
> 
> which allows me to do something like
> 
> stmt = select(mytable)
> with AutoClose(engine.execute(stmt)) as result:
> # do something with result...
> pass
> #result (and possibly connection) gets automatically closed
> 
> But I must admit I see no reason why the with-Protocol shouldn't be 
> implemented in ResultProxy itself.

the only time a result proxy doesn't close automatically is if it a. has result 
rows present and b. you don't fetch them all (where if you need only the first 
row, then call first()).    for the context manager pattern it's typically used 
at the connection/transaction level like this:

with engine.connect() as conn:
    result = conn.execute()

    result = conn.execute()

    # etc.

now it's true that ResultProxy refers to a cursor which has a close() method of 
its own, but in my experience it's more important to frame the operation around 
a connection.   

When using connectionless execution as in engine.execute(), then the 
ResultProxy does refer to a Connection that it will release as well.   

I'm a little concerned that adding a context to resultproxy itself complicates 
the API with too many choices, which is mostly because I'd have preferred if 
engine never had an execute() method in the first place, it's better to work 
with a connection directly.   But it does, so perhaps this should be added.




Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to