yah MySQL doesn't really operate with a mixture. On Jan 10, 2011, at 4:13 PM, Romy wrote:
> 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 <mike...@zzzcomputing.com> 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="n...@unique.com", 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="n...@unique.com", 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 sqlalch...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> sqlalchemy+unsubscr...@googlegroups.com. >>> 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 sqlalch...@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. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.