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
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])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With