How to define metaclass for a class that extends from sqlalchemy declarative base

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • plomon
    New Member
    • Mar 2008
    • 15

    How to define metaclass for a class that extends from sqlalchemy declarative base

    I use: Python 2.6 and sqlalchemy 0.6.1

    This is what I am trying to do:

    Code:
    from sqlalchemy.types import (
    	    Integer,
    	    String,
    	    Boolean
    	)
    	from sqlalchemy.ext.declarative import declarative_base
    
        Base = declarative_base()
    
    	class SampleMeta(type):
            def __new__(cls, name, bases, attrs):
                attrs.update({   'id': Column('Id', Integer, primary_key=True),
                            'name': Column('Name', String),
                            'description': Column('Description', String),
                            'is_active': Column('IsActive', Boolean)
                        })
                return super(SampleMeta, cls).__new__(cls, name, bases, attrs)
    
        class Sample(Base):
            __tablename__ = 'Sample'
            __table_args__ = {'useexisting': True}
            __metaclass__ = SampleMeta
    
            def __init__(self, id, name, description, is_active):
                self.id = id
                self.name = name
                self.description = description
                self.is_active = is_active
    
            def __repr__(self):
                return "<(%d, '%s', '%s', %r)>" % (self.id, self.name, self.description, self.isactive)
    And the error I am getting is this:

    Code:
    TypeError: Error when calling the metaclass bases
        metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
    Now, if I do the same thing above by using

    Code:
    class Sample(object)
    instead of

    Code:
    class Sample(Base)
    it works absolutely fine.

    I need to update the attributes of the class dynamically. So, I will be using dynamic attribute and column names. And I need the above piece code to work in order to be able to get there.

    **Please help**
Working...