On Jan 9, 2011, at 5:03 PM, Arturo Sevilla wrote: > 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?
no, Postgresql must apply minimal locks to the table when it has been accessed within a transaction to provide a minimal level of transaction consistency. SQLA doesn't emit locks or do anything other than emit your SELECT statement. > > 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. > -- 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.
