# Setup
Suppose I have a table with two fields: a string primary key and a boolean 
flag. I want to query multiple rows and then update the flag across all of 
them, then commit my changes. I have a MySQL DB with the following DBAPI 
(http://mysql-python.sourceforge.net/MySQLdb-1.2.2/public/MySQLdb-module.html).

## Model
class TestSQLTable(Base):
    __tablename__ = 'test_table'


    some_string_id = Column(String(32), nullable=False, primary_key=True)
    flag = Column(Boolean, nullable=False, default=True)


# SQLAlchemy 1.0.12

In SQLAlchemy 1.0.12, the following worked:


    sm = sessionmaker(
        autocommit=False,
        autoflush=True,
        expire_on_commit=True,
        bind=engine,  # MySQL engine
    )
    session_factory = scoped_session(sm)


    def modify_records(session, flag=False):
        records = session.query(TestSQLTable).all()
        for r in records:
            r.flag = flag


    session = session_factory()
    modify_records(session)
    session.commit()



# SQLAlchemy 1.1.13
Now, this does *not* work and causes a core dump. I am unable to tell what 
change was made in 1.1 that causes this different behavior when reading the 
["What's New in SQLAlchemy 
1.1?"](http://docs.sqlalchemy.org/en/latest/changelog/migration_11.html) 
guide.

If I do this in a Jupyter notebook, for instance, the kernel just crashes 
on commit without any error.

However, this **does** work for just a single row:

    def modify_record(session, flag=False):
        record = session.query(TestSQLTable).first()
        record.flag = flag


## Ways I have gotten this to work

### Add an explicit return

    def modify_records(session, flag=False):
        records = session.query(TestSQLTable).all()
        for r in records:
            r.flag = flag
        return records  # ADD THIS!


### Flush after each mutation


    def modify_records(session, flag=False):
        records = session.query(TestSQLTable).all()
        for r in records:
            r.flag = flag
            session.flush()  # ADD THIS!


### Restructure code so that the commit happens inside `modify_records`

This works, but is not the way the application is currently built and would 
thus require a major refactor (b/c commit happens via a decorator).

# Main question

Why does this happen exactly for multiple records and why did this work in 
1.0 but does not in 1.1?


Thanks in advance!

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to