I'm using sqla 0.5.8 with turbogears, which uses zope (I admit
ignorance to what zope does, sorry)

When I try to turn autoflush off because I want to make numerous
changes and require queries in the meantime, the flush happens anyway
when I attempt to query.

Over-simplified example demonstrating this behavior:
=========================

from sqlalchemy import *
from sqlalchemy.orm import *
from zope.sqlalchemy import ZopeTransactionExtension


engine = create_engine('postgres://user:p...@localhost:5444/
name',echo=True)
metadata = MetaData()
maker = sessionmaker(bind=engine, autoflush=True, autocommit=False,
                     extension=ZopeTransactionExtension())
DBSession = scoped_session(maker)


order_table = Table("orders", metadata,
    Column("orderid", Unicode, primary_key=True),
    Column("ordersite", Unicode)
)


class Order(object):
    pass

order_mapper = mapper(Order, order_table)

o=Order()
o.orderid = u'SALE25863'  #this order exists in the database
o.ordersite = u'00'

merged=DBSession.merge(o)

# want to do more queries and change more, so set autoflush to False
DBSession.autoflush = False

#however the following still causes flush
rules=DBSession.query(Order).all()

merged.ordersite=u'AA'

#now is when I really want to do the flush
DBSession.flush()


=============================================
(Output below)


As a work-around I can instantiate a new session, but I didn't want
more sessions than I need and I am not sure at what point I would
dispose of the extra session (do I just .close() it after my queries?)

It seems more efficient to use the same session the turbogears
framework has set up... is that the case or can I create and close
sessions often without concern of efficiency?  If I fail to close
them, do they tie up database resources?

In general, autoflush staying on is fine, so I'd rather turn autoflush
off and back on when I am finished with certain transactions where I
know I want it off.  Maybe I'll turn autoflush off in the
sessionmaker, which seems to work, but I still wonder:

Am I doing something wrong?  What is my best workaround?


Output:
>>>
>>>
>>>
>>> from sqlalchemy import *
>>> from sqlalchemy.orm import *
>>> from zope.sqlalchemy import ZopeTransactionExtension
>>>
>>>
>>> engine = create_engine('postgres://user:p...@localhost:5444/name',echo=True)
>>> metadata = MetaData()
>>> maker = sessionmaker(bind=engine, autoflush=True, autocommit=False,
...                      extension=ZopeTransactionExtension())
>>> DBSession = scoped_session(maker)
>>>
>>>
>>> order_table = Table("orders", metadata,
...     Column("orderid", Unicode, primary_key=True),
...     Column("ordersite", Unicode)
... )
>>>
>>> class Order(object):
...     pass
...
>>> order_mapper = mapper(Order, order_table)
>>>
>>>
>>> o=Order()
>>> o.orderid = u'SALE25863'  #this order exists in the database
>>> o.ordersite = u'00'
>>>
>>> merged=DBSession.merge(o)
2010-02-13 06:48:46,816 INFO sqlalchemy.engine.base.Engine.0x...2510
BEGIN
2010-02-13 06:48:46,820 INFO sqlalchemy.engine.base.Engine.0x...2510
SELECT orders.orderid AS orders_orderid, orders.ordersite AS
orders_ordersite
FROM orders
WHERE orders.orderid = %(param_1)s
2010-02-13 06:48:46,820 INFO sqlalchemy.engine.base.Engine.0x...2510
{'param_1': 'SALE25863'}
>>>
>>> # want to do more queries and change more, so set autoflush to False
... DBSession.autoflush = False
>>>
>>>
>>> #however the following still causes flush
... rules=DBSession.query(Order).all()
2010-02-13 06:48:54,620 INFO sqlalchemy.engine.base.Engine.0x...2510
UPDATE orders SET ordersite=%(ordersite)s WHERE orders.orderid = %
(orders_orderid)s
2010-02-13 06:48:54,620 INFO sqlalchemy.engine.base.Engine.0x...2510
{'ordersite': '00', 'orders_orderid': 'SALE25863'}
2010-02-13 06:48:54,622 INFO sqlalchemy.engine.base.Engine.0x...2510
SELECT orders.orderid AS orders_orderid, orders.ordersite AS
orders_ordersite
FROM orders
2010-02-13 06:48:54,622 INFO sqlalchemy.engine.base.Engine.0x...2510
{}
>>>
>>>
>>> merged.ordersite=u'AA'
>>>
>>>
>>> #now is when I really want to do the flush
... DBSession.flush()
2010-02-13 06:49:23,429 INFO sqlalchemy.engine.base.Engine.0x...2510
UPDATE orders SET ordersite=%(ordersite)s WHERE orders.orderid = %
(orders_orderid)s
2010-02-13 06:49:23,429 INFO sqlalchemy.engine.base.Engine.0x...2510
{'ordersite': 'AA', 'orders_orderid': 'SALE25863'}
>>>
>>>
>>>

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

Reply via email to