How to define metaclass for a class that extends from sqlalchemy declarative base ?
Peter Otten
__peter__ at web.de
Wed Jul 3 01:37:42 EDT 2013
Ven wrote:
> 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.
I'm not an sqlalchemy user, but I'd try deriving your metaclass from Base's
metaclass:
BaseMeta = type(Base)
class SampleMeta(BaseMeta):
...
class Sample(Base):
__metaclass__ = SampleMeta
...
More information about the Python-list
mailing list