I have a polymorphic data model where association tables are to base 
classes and some relationships that link to different child classes to 
filter out the non-matching base classes, however these seem to result in 
sqlalchemy being unable to delete cascade properly

In a real case lets say i have
class Base():
   children = relationship("Base", secondary="mix_base_base", cascade="all, 
delete")
   someTypes = relationship("SomeType", secondary="mix_base_base", 
cascade="all, delete")
   other_types = relationship("OtherType", secondary="mix_base_base", 
cascade="all")

class SomeType(Base):
    parents = relationship("Base", secondary="mix_base_base", 
passive_deletes=True)

class OtherType(Base):
    parents = relationship("Base", secondary="mix_base_base", 
passive_deletes=True)


if I delete a base that doesn't have relationships to SomeType and 
OtherType, then everything works great. However once I add those extra 
relationships sqlalchemy no longer deletes the children relationships.  
This can be overcome by using lazy="dynamic" on the relationships, but at 
GREAT performance cost (about 100%), which isn't good.

Does anyone know how to get around this without using dynamic loading? The 
specific relationships are important for front end pagination of data, but 
the performance cost is too great for the amount of data in this system to 
double the query times.

a simplified and stupid workable example where I just add a redundant 
children2 relationship to ChildClass, resulting in the same problem:

from uuid import uuid4

from sqlalchemy import Column
from sqlalchemy.dialects.postgresql.base import UUID
from sqlalchemy.orm import relationship

from webapp.database.orm.base import XPressoBase

class ChildClass(Base):
__tablename__ = "child_class"
id = Column("id", UUID(as_uuid=True), primary_key=True, default=uuid4())
parents = relationship("ParentClass", 
secondary="mix_parent_class_child_class", passive_deletes=True)
children = relationship("ChildChildClass", 
secondary="mix_child_class_child_child_class", cascade="all, delete")
children2 = relationship("ChildChildClass", 
secondary="mix_child_class_child_child_class", cascade="all, delete")

class ChildChildClass(Base):
__tablename__ = "child_child_class"
id = Column("id", UUID(as_uuid=True), primary_key=True, default=uuid4())
parents = relationship("ChildClass", 
secondary="mix_child_class_child_child_class", passive_deletes=True)

class ParentClass(Base):
__tablename__ = "parent_class"
id = Column("id", UUID(as_uuid=True), primary_key=True, default=uuid4())
children = relationship("ChildClass", 
secondary="mix_parent_class_child_class", cascade="all, delete")

from sqlalchemy.sql.schema import Table, ForeignKey, Column, 
UniqueConstraint

from webapp.database.orm.base import XPressoBase

mix_parent_class_child_class = Table(
"mix_parent_class_child_class",
XPressoBase.metadata,
Column("parent_class_id", ForeignKey("parent_class.id", 
ondelete="CASCADE"), nullable=False),
Column("child_class_id", ForeignKey("child_class.id"), nullable=False),
UniqueConstraint(
"parent_class_id", "child_class_id", name="uix_parent_class_child_class"
),
)

mix_child_class_child_child_class = Table(
"mix_child_class_child_child_class",
XPressoBase.metadata,
Column("child_class_id", ForeignKey("child_class.id", ondelete="CASCADE"), 
nullable=False),
Column("child_child_class_id", ForeignKey("child_child_class.id"), 
nullable=False),
UniqueConstraint(
"child_class_id", "child_child_class_id", 
name="uix_child_class_child_child_class"
),
)

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/e6546493-673c-4aab-aa96-88984c1a2e1en%40googlegroups.com.

Reply via email to