[sqlalchemy] Possible regression from 0.7.9 to 0.8.0

2013-05-13 Thread Gerald Thibault
I have the following code:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session, relationship, backref


e = create_engine('sqlite:tmp/test.db', echo=True)
Base = declarative_base()
Base.metadata = MetaData(e)


class Node(Base):
__tablename__ = 'nodes'

id = Column(Integer, primary_key=True)

class Item(Base):
__tablename__ = 'items'

id = Column(Integer, primary_key=True)
node_id = Column(Integer, ForeignKey(Node.id))
item_type = Column(String(24), default='item')

node = relationship(Node, lazy=True, uselist=False,
backref=backref('objects', lazy=True, uselist=True))

__mapper_args__ = {
'polymorphic_identity': 'item',
'polymorphic_on': 'item_type',
'with_polymorphic': '*',
}

class PolyItem(Item):
__tablename__ = 'poly_items'

id = Column(Integer, ForeignKey(Item.id), primary_key=True)

__mapper_args__ = {
'polymorphic_identity': 'polyitem',
}

item = relationship(Item, lazy=True)

if __name__ == '__main__':
Base.metadata.drop_all()
Base.metadata.create_all()

node = Node()
item = PolyItem(node=node)
session = Session(e)
session.add(node)
session.add(item)
session.commit()

node = session.query(Node).first()
session.delete(node)
session.commit()

This runs fine in 0.7.9 and 0.8.0. However, if I change PolyItem.item to 
relationship(Item, lazy=False), 0.7.9 continues to function, while 0.8.0 
and 0.8.1 go into infinite loops and eventually fail due to maximum 
recursion exceeded. The adding to the db works, it's the delete that is 
failing.

I've already worked around it on my end (lazy=False seems of little use 
here, and was being added programatically, so I adjusted it there and it 
seems okay), but I figured I'd point it out as the behavior changed pretty 
radically between those 2 versions.

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [sqlalchemy] Possible regression from 0.7.9 to 0.8.0

2013-05-13 Thread Michael Bayer
this is a reopen of http://www.sqlalchemy.org/trac/ticket/2481, and is fixed 
again in r7699a1080742.   Thanks for the report.


On May 13, 2013, at 3:18 PM, Gerald Thibault dieselmach...@gmail.com wrote:

 I have the following code:
 
 from sqlalchemy import *
 from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.orm import Session, relationship, backref
 
 
 e = create_engine('sqlite:tmp/test.db', echo=True)
 Base = declarative_base()
 Base.metadata = MetaData(e)
 
 
 class Node(Base):
 __tablename__ = 'nodes'
 
 id = Column(Integer, primary_key=True)
 
 class Item(Base):
 __tablename__ = 'items'
 
 id = Column(Integer, primary_key=True)
 node_id = Column(Integer, ForeignKey(Node.id))
 item_type = Column(String(24), default='item')
 
 node = relationship(Node, lazy=True, uselist=False,
 backref=backref('objects', lazy=True, uselist=True))
 
 __mapper_args__ = {
 'polymorphic_identity': 'item',
 'polymorphic_on': 'item_type',
 'with_polymorphic': '*',
 }
 
 class PolyItem(Item):
 __tablename__ = 'poly_items'
 
 id = Column(Integer, ForeignKey(Item.id), primary_key=True)
 
 __mapper_args__ = {
 'polymorphic_identity': 'polyitem',
 }
 
 item = relationship(Item, lazy=True)
 
 if __name__ == '__main__':
 Base.metadata.drop_all()
 Base.metadata.create_all()
 
 node = Node()
 item = PolyItem(node=node)
 session = Session(e)
 session.add(node)
 session.add(item)
 session.commit()
 
 node = session.query(Node).first()
 session.delete(node)
 session.commit()
 
 This runs fine in 0.7.9 and 0.8.0. However, if I change PolyItem.item to 
 relationship(Item, lazy=False), 0.7.9 continues to function, while 0.8.0 and 
 0.8.1 go into infinite loops and eventually fail due to maximum recursion 
 exceeded. The adding to the db works, it's the delete that is failing.
 
 I've already worked around it on my end (lazy=False seems of little use here, 
 and was being added programatically, so I adjusted it there and it seems 
 okay), but I figured I'd point it out as the behavior changed pretty 
 radically between those 2 versions.
 
 -- 
 You received this message because you are subscribed to the Google Groups 
 sqlalchemy group.
 To unsubscribe from this group and stop receiving emails from it, send an 
 email to sqlalchemy+unsubscr...@googlegroups.com.
 To post to this group, send email to sqlalchemy@googlegroups.com.
 Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
 For more options, visit https://groups.google.com/groups/opt_out.
  
  

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.