Not sure what you mean, as I've seen hybrid setups before.

In any case, thanks for helping me narrow this down. I need to decide
whether I'll need real transactions here. Despite being an oversight
on my part, do you think perhaps the docs for rollback / commit should
mention DB support ? I did look at them before writing to the list,
and it still didn't dawn on me.

On Jan 10, 1:19 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> 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 
> > 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.

Reply via email to