Skip to content Skip to sidebar Skip to footer

Sqlalchemy Introspect Column Type With Inheritance

Considering this code (and using SQLAlchemy 0.7.7): class Document(Base): __tablename__ = 'document' __table_args__ = { 'schema': 'app' } id = Column(types

Solution 1:

The ORM has allowed you to define classes in an inheritance pattern that corresponds to a JOIN of two tables. This structure is full service, and can also be used to find out basic things like the types of attributes on columns, pretty much directly:

type = Arrete.date.property.columns[0].type

note that this is basically the same thing as the approach of trudging through __bases__, except you let Python's normal class mechanics do the work.

Solution 2:

You can explore the base classes...

deffind_type(class_, colname):
    ifhasattr(class_, '__table__') and colname in class_.__table__.c:
        return class_.__table__.c[colname].typefor base in class_.__bases__:
        return find_type(base, colname)
    raise NameError(colname)

print find_type(Arrete, 'date_arrete')
print find_type(Arrete, 'date')

Solution 3:

You need the abstract special directive or the mixin pattern.

For a mixin, you'd use something like this:

classMyMixin(object):
    __tablename__ = 'document'
    __table_args__ = {
        'schema': 'app'
    }

    id = Column(types.Integer, primary_key=True)
    nom = Column(types.Unicode(256), nullable=False)
    date = Column(types.Date())

classArrete(MyMixin, Base):
    __tablename__ = 'arrete'

    __mapper_args__ = {'polymorphic_identity': 'arrete'}

    foreign_id = Column(types.Integer, ForeignKey('app.document.id'), primary_key=True)
    numero_arrete = Column(types.Integer)
    date_arrete = Column(types.Date())


classDocument(MyMixin, Base):
    __tablename__ = 'Document'
    type_document = Column(types.Enum('arrete', 'photographie',
        name='TYPES_DOCUMENT_ENUM'))
    __mapper_args__ = {'polymorphic_on': type_document}

Shared stuff goes in the mixin, non shared stuff in the sub classes.

Post a Comment for "Sqlalchemy Introspect Column Type With Inheritance"