The problem with using Mixins is that you need to know the definition of
columns already for creating the mixin class. What I am trying to do is
more like get the definition dynamically on the fly.Take a look at this:
def get_properties(tablename, map):
table_inspector = reflection.Inspector.from_engine(DB_ENGINE.connect())
table = Table(tablename, metadata)
table_inspector.reflecttable(table, None)
columns = []
for child in table.get_children():
if isinstance(child, Column):
column = list(child.base_columns)[0]
column.table = None
columns.append(column)
return dict([(map[column.key], column) for column in columns])
class CustomDeclarativeMeta(DeclarativeMeta):
def __new__(cls, name, bases, attrs):
attrs.update(get_properties(attrs.get('__tablename__'),
attrs.get('__map__')))
return super(CustomDeclarativeMeta, cls).__new__(cls, name, bases,
attrs)
# Base = declarative_base(metaclass=CustomDeclarativeMeta)
Base = declarative_base()
class Enum_SampleBase):
__tablename__ = 'Enum_Sample'
__table_args__ = {'useexisting': True}
__metaclass__ = CustomDeclarativeMeta
__map__ = {'Id': 'id', 'Name': 'name', 'Description': 'description',
'IsActive': 'is_active'}
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)
Unfortunately, this isn't working. I want to declare column types by
getting them from a table that's already created in the database.
On Wed, Jul 3, 2013 at 11:11 AM, Michael Bayer <[email protected]>wrote:
> your metaclass must derive from the DeclarativeMeta class.
>
> Also, I disagree that you need this metaclass, what you're trying to do
> is very easy using mixins, which are supported in version 0.6:
> http://docs.sqlalchemy.org/en/rel_0_6/orm/extensions/declarative.html#mixing-in-columns
>
>
>
>
> On Jul 3, 2013, at 12:44 AM, Ven Karri <[email protected]> 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.
>
> **Please help**
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
>
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/sqlalchemy/37M-1Qf8HO8/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>
--
Have a nice day !!!
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.