Dnia 2009-12-01, Wt o godzinie 21:58 -0800, rajasekhar911 pisze:
> but this happen only when i use innodb as engine.
> didnt give an error on myisam on mysql or sqlite.
> 
> 

Probably because myisam is not transactional and sqlite usually doesn't
care about constraints.

Tomasz Jezierski
Tefnet
www.tefnet.pl


> On Dec 2, 3:12 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
> > On Dec 1, 2009, at 2:16 PM, rajasekhar911 wrote:
> >
> >
> >
> > > i have following relation b/w 3 tables
> >
> > > class A(DeclarativeBase)
> > > __tablename__='a'
> > > id=Column(Unicode(50))#primarykey
> > > name=Column(Unicode(50))
> > > cc=relation(C, \
> > >                    primaryjoin=id == C.b_id,\
> > >                    foreign_keys=[C.b_id],\
> > >                    uselist=False,cascade='all, delete, delete-
> > > orphan')
> >
> > > class B(DeclarativeBase)
> > > __tablename__='b'
> > > id=Column(Unicode(50))#primarykey
> > > name=Column(Unicode(50))
> >
> > > class C(DeclarativeBase)
> > > __tablename__='c'
> > > id=Column(Integer)#primarykey
> > > name=Column(Unicode(50))
> > > b_id=Column(Unicode(50),ForeignKey('b.id',\
> > >                    onupdate="CASCADE",ondelete="CASCADE"))
> >
> > > bb=B(name='bb')
> > > aa=A(name='aa')
> > > aa.cc=C(name='ca',b_id=bb.id)
> >
> > you haven't established a relation() between C and B here so SQLA has no 
> > awareness that B needs to be inserted before C.  Also bb.id is None until 
> > the session is flushed.   If you use a relation() from C to B, that would 
> > solve the issue.  Also A.cc is strange here in that you're repurposing the 
> > foreign key C.b_id to point to A which is nonsensical to be on A, which has 
> > nothing to do with B.
> >
> > > DBSession.add(bb)
> > > DBSession.add(aa)
> >
> > > throws
> >
> > > (IntegrityError) (1452, Cannot add or update a child row: a foreign
> > > key constraint fails (`test/c`, CONSTRAINT `c_ibfk_1` FOREIGN KEY
> > > (`b_id`) REFERENCES `b` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) )
> > > u INSERT INTO c (id, b_id, name) VALUES (%s, %s, %s)
> >
> > > if i do a flush in b/w the add it works fine
> > > DBSession.add(bb)
> > > DBSession.flush()
> > > DBSession.add(aa)
> >
> > > even
> > > bb=B(name='bb')
> > > cc=C(name='ca',b_id=bb.id)--removed the relation from B
> > > DBSession.add(bb)
> > > DBSession.add(cc)
> > > throws the same error
> >
> > > I am working on turbogears 2.0, SQLAlchemy0.5.6
> > > session is created with autoflush=true and autocommit=true
> > > mysql 5.0 with innodb engine
> >
> > > shouldn't the flush takes place by default or the transaction should
> > > take care of it?
> >


--

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