Hello, Thanks. That makes sense and it worked. Does SQLAlchemy executes LOCK TABLE with each transaction http://www.postgresql.org/docs/9.0/static/sql-lock.html or how does it acquire the lock?
Now that you mention closing the session, do you think is a good idea to close it also at the end of each Pylons request? As I need concurrent access to the database in this application. On Jan 9, 8:28 am, Michael Bayer <[email protected]> wrote: > Any access of session-bound objects after a commit() are going to access the > database, which means the Session starts a new transaction. > > Close out the transactional resources held by your Session after each test > ends. Otherwise PG maintains locks on each table that has been accessed in > the current transaction and the tables will not be able to be dropped. In a > unit test scenario, the closing out of the Session is typically part of the > tearDown(). > > http://www.sqlalchemy.org/docs/orm/session.html#closing > > On Jan 9, 2011, at 6:24 AM, Arturo Sevilla wrote: > > > > > > > > > Hello, > > > I've been trying to do unit testing with SQLAlchemy and PostgreSQL. In > > my model/tables I have two entities state and country, state has a > > foreign key relating to country (no problems there). > > > In my setUp() method I call create_all() for my metadata while in > > tearDown() I call drop_all(). The problem that I was detecting is that > > it nosetests frozes when is dropping the "state" table after running > > the following test: > > > def test_country_create_orm(self): > > new_country = Country('Country') > > id = new_country.id > > session = Session() > > session.add(new_country) > > session.commit() > > #session.flush() > > test_country = session.query(Country).get(id) > > assert test_country.id == id > > > The Session class is generated with sessionmaker() in the following > > way (where engine is the parameter that is passed on to init_model of > > Pylons, however I tested the same conditions with create_engine): > > > sm = orm.sessionmaker(bind=engine, autoflush=True, autocommit=False) > > Session = orm.scoped_session(sm) > > > I chased the problem through a debugger down onto the implementation > > of do_execute for the cursor for the Connection object for PostgreSQL, > > after which I strace'd it and discovered that it was being hold on the > > poll(2) system call. > > > I don't know if I'm doing something wrong but I discovered that my > > unit tests work if I configure my Session class as: > > > sm = orm.sessionmaker(bind=engine, autoflush=True, autocommit=True) > > Session = orm.scoped_session(sm) > > > And flush()ing instead of commit()ing. What also works is that if > > instead of doing the query > > > test_country = session.query(Country).get(id) > > > I do this: > > > count = session.query(Country).count() > > > This doesn't appear to be restricted to the drop_all() method of > > MetaData. If I import my Table object that represents my "State" table > > and drop it directly it also freezes: > > > from myapp.model.table import state > > state.drop() # freezes > > > I have tested this issue with Python 2.6.6, SQLAlchemy 0.6.5 and > > 0.6.6, psycopg2 2.3.1 and 2.3.2 and PostgreSQL 8.4.5. > > > Any insights? > > > -- > > 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 > > athttp://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 [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.
