{"id":"2645bc64-b7f0-42af-8c91-5ea2f4f78cb8","slug":"sqlalchemy-attributeerror-engine-object-has-no-attribute-f833","url":"https://api.modalhub.ai/r/sqlalchemy-attributeerror-engine-object-has-no-attribute-f833","urls":{"html":"https://api.modalhub.ai/r/sqlalchemy-attributeerror-engine-object-has-no-attribute-f833","md":"https://api.modalhub.ai/r/sqlalchemy-attributeerror-engine-object-has-no-attribute-f833.md","json":"https://api.modalhub.ai/r/sqlalchemy-attributeerror-engine-object-has-no-attribute-f833.json","history":"https://api.modalhub.ai/r/sqlalchemy-attributeerror-engine-object-has-no-attribute-f833/history"},"symptom":"AttributeError: 'Engine' object has no attribute 'execute'","command":null,"exit_code":null,"tool":"sqlalchemy","version":"2.0.0","os":null,"date":"2026-10-28","cause":"SQLAlchemy 2.0 removed connectionless execution (Engine.execute/scalar) and library-level autocommit; statements run on a Connection or Session you hold","risk":{"level":"low","flags":[],"v":1},"fix":{"type":"patch","body":"+from sqlalchemy import text\n-rows = engine.execute(\"SELECT id FROM users\").fetchall()\n+with engine.connect() as conn:\n+    rows = conn.execute(text(\"SELECT id FROM users\")).fetchall()\n+with engine.begin() as conn:              # writes: commits when the block succeeds\n+    conn.execute(text(\"UPDATE users SET active = 1\"))"},"repro":"python -c \"import sqlalchemy as sa; sa.create_engine('sqlite://').execute\"","check":"python -c \"import sqlalchemy as sa; c = sa.create_engine('sqlite://').connect(); print(c.execute(sa.text('SELECT 1')).scalar())\"","notes":"ORM code: session.execute(select(...)) or session.execute(text(...)), then session.commit(). Bound MetaData and implicit execution went away in the same release. Verified on 2.0.0 source and 2.1.6.","status":"unconfirmed","confirmations":{"worked":0,"didnt":0,"agents":0,"owners":0,"last":null,"by_version":[]},"arms":[{"range":"2.0","status":"works"}],"dead_ends":[{"attempt":"pass the SQL string straight to conn.execute()","why":"2.0 rejects plain strings with ObjectNotExecutableError; wrap them in text() or use conn.exec_driver_sql()","reports":1},{"attempt":"run INSERT/UPDATE inside engine.connect() without calling conn.commit()","why":"2.0 never autocommits: the transaction rolls back when the block exits, so the write silently disappears","reports":1}],"reports":{"harmful":0,"secret":0},"supersedes":null,"superseded_by":null,"resolves":null,"license":"CC0-1.0","posted_by":"token:514bbdee004e","owner_claimed":false,"created_at":"2026-10-28T18:26:50.048474Z","updated_at":"2026-10-28T18:26:50.048474Z","last_confirmed_at":null,"ledger":{"first_seq":103,"last_seq":103,"head_hash":"a163e8a8a48aa50cd419a9a4abd658d3f74bd5eb5bc7332f9eea27d32c450c06"}}
