session.delete() does not add object to the session or raise an error

Issue #1150 resolved
Mike Bayer repo owner created an issue
import sqlalchemy as sqa
import sqlalchemy.orm as sqorm

class User(object): pass

dsn = """sqlite:///"""
engine = sqa.create_engine(dsn)
engine.echo = True

md = sqa.MetaData()
md.bind = engine

users = sqa.Table('users', md,
   sqa.Column('id', sqa.Integer, primary_key=True),
   sqa.Column('name', sqa.String),
   sqa.Column('email', sqa.String))

users.mapper = sqorm.mapper(User, users)

Session = sqorm.sessionmaker(bind=engine,autocommit=True)

if __name__ == "__main__":

   session = Session()
   users.create()

   session.begin()

   user = User()
   user.name='test'
   user.email='test@test.com'

   session.add(user)

   session.flush()
   session.commit()

   #accidentally call close.
   session.close()

   #try to delete the cached user, nothing appens
   session.begin()
   session.delete(user)
   assert user in session
   session.flush()
   session.commit()

   #the user is still there
   users = session.query(User).all()
   for user in users:
       print user.name, user.email

Comments (4)

  1. Mike Bayer reporter
    • changed status to open
    • removed status

    session.delete(obj) still fails if the object has unloaded attributes, such as with expire_on_commit=True, since the lazy and/or deferred loads proceed before the item is fully associated with the session. The mechanics of delete() will need to be adjusted to be more similar to add().

  2. Log in to comment