On Fri, Feb 17, 2017 at 10:03 AM,  <linlyc...@gmail.com> wrote:
> I want to achieve something like this:
>
> Base = declarative_base()
>
> # the abstract base, no table generated for it
> class TreeNode(Base):
> __abstract__ = True
> parent = Column(ForeignKey('child_class_table.id'), nullable=False)
>
> def is_root(self):
> pass
> def get_parent(self):
> pass
>
> # more methods
>
>
> # the child, mapped to a table(in this case named 'discipline')
> class Discipline(TreeNode):
> __tablename__ = 'discipline'
>
> id = Column(Integer, primary_key=True)
> name = Column(Unicode(500), nullable=False)
>
>
> # a generated auxiliary table for the child(in this case named
> 'discipline_closure')
> class DisciplineClosure(Base):
> __tablename__ = 'discipline_closure'
>
> ancestor_id = Column(ForeignKey('discipline.id'), nullable=False)
> descendant_id = Column(ForeignKey('discipline.id'), nullable=False)
> depth = Column(Integer, nullable=False)
>
> Is this possible in SQLAlchemy? How to implement it ?
> Or is there an another way to implement my closure table ?
>
> My Django implementation Attached, but I wanna do it using SQLAlchemy.
>

You could look at the versioned_history example, which creates history
tables for classes inheriting from a "Versioned" mixin:

http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.versioned_history

Here's the Versioned class:

class Versioned(object):
    @declared_attr
    def __mapper_cls__(cls):
        def map(cls, *arg, **kw):
            mp = mapper(cls, *arg, **kw)
            _history_mapper(mp)
            return mp
        return map

Declarative accesses the __mapper_cls__ attribute when creating the
SQLAlchemy mapper for the class. The Versioned class uses that as a
hook to generate the second class.

This is a bit of a hack (particularly since __mapper_cls__ seems to be
barely documented). It might be possible to do something similar using
ORM events, but I haven't tried it. You could investigate the
mapper_configured event:

http://docs.sqlalchemy.org/en/latest/orm/events.html#sqlalchemy.orm.events.MapperEvents.mapper_configured

The code would look something like:

@event.listens_for(TreeNode, 'mapper_configured', propagate=True)
def receive_mapper_configured(mapper, class_):
    # Create your Closure class here

Hope that helps,

Simon

-- 
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 post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to