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

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice