can't reproduce:

from sqlalchemy import *

m = MetaData()
t = Table('t', m, Column('x', Integer))

s = select([t], for_update="read")

from sqlalchemy.dialects import postgresql
print s.compile(dialect=postgresql.dialect())

e = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
with e.begin() as conn:
    m.create_all(conn)
    conn.execute(s)


the output shows that both as a standalone compile as well as within a 
Postgresql conversation, we get FOR SHARE.  Tested in 0.7.9 and 0.8.0b2.   If 
you can provide a full runnable test case, that might shed more light.



SELECT t.x 
FROM t FOR SHARE
2012-12-20 23:53:33,670 INFO sqlalchemy.engine.base.Engine select version()
2012-12-20 23:53:33,671 INFO sqlalchemy.engine.base.Engine {}
2012-12-20 23:53:33,672 INFO sqlalchemy.engine.base.Engine select 
current_schema()
2012-12-20 23:53:33,672 INFO sqlalchemy.engine.base.Engine {}
2012-12-20 23:53:33,674 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2012-12-20 23:53:33,674 INFO sqlalchemy.engine.base.Engine select relname from 
pg_class c join pg_namespace n on n.oid=c.relnamespace where 
n.nspname=current_schema() and relname=%(name)s
2012-12-20 23:53:33,675 INFO sqlalchemy.engine.base.Engine {'name': u't'}
2012-12-20 23:53:33,676 INFO sqlalchemy.engine.base.Engine SELECT t.x 
FROM t FOR SHARE
2012-12-20 23:53:33,676 INFO sqlalchemy.engine.base.Engine {}
2012-12-20 23:53:33,676 INFO sqlalchemy.engine.base.Engine COMMIT



On Dec 20, 2012, at 9:01 PM, utkonos wrote:

> I am trying SELECT FOR SHARE a set of rows in a table so that they are locked 
> until the end of the transaction. I am using SQLAlchemy 0.7.9 to do this in a 
> PostgreSQL 9.1.6 database. This is the python code in question:
> 
> NUM_TERMS = 10
> conn = engine.connect()
> get_terms = select([search_terms.c.term_id, search_terms.c.term],
>                    and_(search_terms.c.lock==False,
>                    search_terms.c.status==False),
>                    order_by=search_terms.c.term,
>                    limit=NUM_TERMS, for_update="read")
> trans = conn.begin()
> try:
>     search_terms = conn.execute(get_terms).fetchall()
>     for term in search_terms:
>         lock_terms = update(search_terms).\
>                      where(search_terms.c.term_id==term.term_id).\
>                      values(lock=True)
>         conn.execute(lock_terms)
>     if trans.commit():
>         <do things with the search terms>
> except:
>     trans.rollback()
> The problem is the SQL query generated by the select code above is not FOR 
> SHARE, it's FOR UPDATE:
> 
> SELECT search_terms.term_id, search_terms.term
> FROM search_terms
> WHERE search_terms.lock = :lock_1 AND search_terms.status = :status_1     
> ORDER BY search_terms.term
> LIMIT :param_1 FOR UPDATE
> According to the SQLAlchemy API docs, under the "for_update" parameter 
> description:
> 
> With the Postgresql dialect, the values “read” and "read_nowait" translate to 
> FOR SHARE and FOR SHARE NOWAIT, respectively.
> 
> According to the above, the compiled SQL statement should be FOR SHARE, but 
> it is not. Where is the error in my code?
> 
> If you have a good answer, please also answer it on stackoverflow
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/sqlalchemy/-/wmFM_7UILRoJ.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> 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 sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to