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.