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

attributes, dynamic, metaclass, python, sqlalchemy

Solution

to use the metaclass, it would have to derive from Declaratives `DeclaredMeta` in this case. But no metaclass is needed for this use case. Use mixins:

from sqlalchemy.types import (
    Integer,
    String,
    Boolean
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column

Base = declarative_base()

class SampleMixin(object):
    id = Column("Id", Integer, primary_key=True)
    name = Column("Name", String)
    description = Column("Description", String)
    is_active = Column("IsActive", Boolean)

class Sample(SampleMixin, Base):
    __tablename__ = 'Sample'
    __table_args__ = {'useexisting': True}

    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)

from sqlalchemy import select
print select([Sample.id, Sample.name])

Problem

I use: Python 2.6 and sqlalchemy 0.6.1 This is what I am trying to do: ``` 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: ``` 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 ``` class Sample(object) ``` instead of ``` 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

Original source