1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

How to define metaclass for a class that extends from sqlalc

Discussion in 'Python' started by imperialguy, Jul 3, 2013.

  1. imperialguy

    imperialguy New Member

    Joined:
    Jul 3, 2013
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    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
     

Share This Page