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'