Alright... I was able to track this down to a cPython problem in Python 3.6.0. This reproes with SQLite as well. When moving to Python 3.6.2, this goes away. This fixed the culprit: https://github.com/serhiy-storchaka/cpython/commit/5aafff22a20715d276a23d30b7335bbecbc31754
On Tuesday, August 22, 2017 at 2:02:25 AM UTC-7, Simon King wrote: > > On Tue, Aug 22, 2017 at 9:26 AM, Konstantin Kashin <kvka...@gmail.com > <javascript:>> wrote: > > # 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? > > What platform are you running this on, and how have you installed > MySQLdb and SQLAlchemy? If you ugraded SQLAlchemy in-place, is there > any chance that you are running a mix of old and new code? Have you > reproduced the error in a completely fresh installation? > > Simon > -- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.