Face palm.. missed the forest for the trees. Does this mean both tables would need to be InnoDB ?
On Jan 10, 7:10 am, Michael Bayer <[email protected]> wrote: > One important change here is to change the engine type to InnoDB, otherwise > transactions are entirely meaningless with MySQL. > > If I use InnoDB, the end result of "used" is 0 in all cases. If I don't and > use MyISAM, the end result of "used" is 1 in all cases, regardless of whether > InviteCode is loaded before, or after, the begin(). > > It seems likely that the issue is simply that you forgot to use InnoDB. > > On Jan 10, 2011, at 1:43 AM, Romy wrote: > > > > > > > > > Sorry Michael, 'self-contained' wasn't a proper term for that test > > given that it required an initial DB state containing a single row. > > I've modified your version to try and reproduce the bug. > > > Since yours didn't use elixir at all and I'm not familiar with > > elixir's internals, I was able to reproduce only what I believe to be > > the equivalent in sqlalchemy. Please note you'll need to create a > > mysql database and fill in the connection string, as the test does not > > fail with sqlite! > > > from sqlalchemy import * > > from sqlalchemy.orm import * > > from sqlalchemy.ext.declarative import declarative_base > > > e = create_engine('mysql://user:p...@localhost/test', echo=True) > > > Base = declarative_base() > > > class InviteCode(Base): > > __tablename__ = 'test_invite_codes' > > id = Column(Integer, primary_key=True) > > used = Column(Integer, default=0) > > users = relationship("User", backref="invite_code") > > > class User(Base): > > __tablename__ = 'test_users' > > id = Column(Integer, primary_key=True) > > invite_code_id = Column(Integer, > > ForeignKey('test_invite_codes.id')) > > email = Column(String(128), unique=True) > > > Base.metadata.create_all(e) > > session = Session(e, autocommit=True) > > > session.query(User).delete() > > session.query(InviteCode).delete() > > > invite_code = InviteCode() > > session.add(invite_code) > > session.flush() > > > assert invite_code.used == 0 > > > session.close() > > > session.begin() > > user_row = User(email="[email protected]", invite_code_id=None) > > session.add(user_row) > > session.commit() > > > invite_code = session.query(InviteCode).first() > > assert invite_code.used == 0 > > > session.begin() > > invite_code.used = invite_code.used + 1 > > session.add(invite_code) > > session.flush() > > user_row_2 = User(email="[email protected]", invite_code_id=None) > > session.add(user_row_2) > > > rolled_back = False > > > try: > > session.commit() > > except: > > rolled_back = True > > session.rollback() > > > assert rolled_back > > assert invite_code.used == 0 > > > -- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]. > > For more options, visit this group > > athttp://groups.google.com/group/sqlalchemy?hl=en. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
