Code is below: see NOTE comments

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, Unicode
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from contextlib import contextmanager

USERNAME = u'root'
PASSWORD = u''
LOCAL_DB = u'localhost'
DATABASE = u'test_db'

engine = create_engine(u'mysql+mysqldb://{}:{}@{}/{}'.format(
    USERNAME, PASSWORD, LOCAL_DB, DATABASE), echo=True)

get_session = sessionmaker(bind=engine)
mysql = declarative_base(bind=engine)

server_engine = create_engine(u'mysql+mysqldb://{}:{}@{}'.format(
    USERNAME, PASSWORD, LOCAL_DB))
get_server_session = sessionmaker(bind=server_engine)
server_session = get_server_session()
server_session.execute('CREATE DATABASE IF NOT EXISTS test_db')
server_session.commit()
server_session.close()


@contextmanager
def mysql_session():
    try:
        session = get_session()
        yield session
    except Exception as e:
        session.rollback() # Release any potential locks
        raise e
    finally:
        session.rollback()
        session.close()


class User(mysql):
    __tablename__ = u'user'
    id = Column(Integer, primary_key=True)
    first_name = Column(Unicode(64))
    last_name = Column(Unicode(64))


session = get_session()
mysql.metadata.drop_all()
mysql.metadata.create_all()


def add_last_name(user_id):
    with mysql_session() as s:
        user = s.query(User).filter(User.id == user_id).one()
        user.last_name = u'Litz'
        s.commit()


with mysql_session() as s:
    new_user = User(first_name=u'Derek')
    s.add(new_user)
    s.commit()
    add_last_name(new_user.id)
    # NOTE this makes sense, the object was never updated here
    assert not new_user.last_name == u'Litz'
    # NOTE Why doesn't user receive the updated information?
    user = s.query(User).filter(User.id == new_user.id).one()
    assert not user.last_name == u'Litz'
    # NOTE Despite commit being the last thing I did for this session
    # this fixes the problem.  Why didn't it before?
    s.commit() # or s.rollback() or s.close()
    user = s.query(User).filter(User.id == new_user.id).one()
    assert user.last_name == u'Litz'

-- 
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/-/xvzKe6ceB9wJ.
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